在 git 上更新文件,添加干净的过滤器和 sed
Update file on git add with clean filter and sed
我的一些项目文件的顶部有一个小 header,我想确保每次对它们进行更改时都更新到当前年份。我在 git 中的清洁过滤器出现问题并抛出错误:
首先,我的 master 分支上有一个名为 testClass.cs
的文件:
// *********************
// File active 2011-2014
// *********************
然后我对文件做了一个小改动:
// *********************
// File active 2011-2014
// *********************
// First commit, wahoo!
然后我 运行 git add testClass.cs
为下一次提交暂存更改。这个 运行 是我的 git clean 过滤器,它使用 sed
尝试就地编辑文件以将 header 中的年份更新为 2015(即 2011-2014 应该是更改为 2011-2015)。这是带有过滤器设置的配置:
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
hideDotFiles = dotGitOnly
[filter "updatedate"]
clean = sed -i "s/2011-[[:digit:]]\{4\}/2011-$(date '+%Y')/" %f
我遇到的问题是 add/update 由于 "Device or resource busy" 错误而失败。似乎与 sed 创建的临时文件有关。如果我在命令行上测试 sed 命令,它可以正常工作,但用作过滤器时会失败。
$ git add testClass.cs
sed: cannot rename ./sed0jmaI2: Device or resource busy
error: external filter sed -i s/2011-[[:digit:]]\{4\}/2011-$(date '+%Y')/ %f failed 4
error: external filter sed -i s/2011-[[:digit:]]\{4\}/2011-$(date '+%Y')/ %f failed
我正在使用 git bash 版本 2.5.3 (MINGW64)。
这里有些事情很奇怪,其中之一是您没有像流一样使用 sed
。 clean
采用标准输入通过命令运行它并将文件修改为标准输出。它更像是 cat foo.txt | sed 's/foo/bar/'
。所以不需要 -i
,它会破坏事情。除此之外,我认为 git 不喜欢正则表达式,在这种情况下,您可以通过更具体来做得更好。
[filter "updatedate"]
clean = sed "s/2011-20[01][0-9]/2011-$(date '+%Y')/"
请注意,这不会更改您的本地副本,您必须拉取以查看拉取目录中的更改,因此 smudge
命令。
我的一些项目文件的顶部有一个小 header,我想确保每次对它们进行更改时都更新到当前年份。我在 git 中的清洁过滤器出现问题并抛出错误:
首先,我的 master 分支上有一个名为 testClass.cs
的文件:
// *********************
// File active 2011-2014
// *********************
然后我对文件做了一个小改动:
// *********************
// File active 2011-2014
// *********************
// First commit, wahoo!
然后我 运行 git add testClass.cs
为下一次提交暂存更改。这个 运行 是我的 git clean 过滤器,它使用 sed
尝试就地编辑文件以将 header 中的年份更新为 2015(即 2011-2014 应该是更改为 2011-2015)。这是带有过滤器设置的配置:
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
hideDotFiles = dotGitOnly
[filter "updatedate"]
clean = sed -i "s/2011-[[:digit:]]\{4\}/2011-$(date '+%Y')/" %f
我遇到的问题是 add/update 由于 "Device or resource busy" 错误而失败。似乎与 sed 创建的临时文件有关。如果我在命令行上测试 sed 命令,它可以正常工作,但用作过滤器时会失败。
$ git add testClass.cs
sed: cannot rename ./sed0jmaI2: Device or resource busy
error: external filter sed -i s/2011-[[:digit:]]\{4\}/2011-$(date '+%Y')/ %f failed 4
error: external filter sed -i s/2011-[[:digit:]]\{4\}/2011-$(date '+%Y')/ %f failed
我正在使用 git bash 版本 2.5.3 (MINGW64)。
这里有些事情很奇怪,其中之一是您没有像流一样使用 sed
。 clean
采用标准输入通过命令运行它并将文件修改为标准输出。它更像是 cat foo.txt | sed 's/foo/bar/'
。所以不需要 -i
,它会破坏事情。除此之外,我认为 git 不喜欢正则表达式,在这种情况下,您可以通过更具体来做得更好。
[filter "updatedate"]
clean = sed "s/2011-20[01][0-9]/2011-$(date '+%Y')/"
请注意,这不会更改您的本地副本,您必须拉取以查看拉取目录中的更改,因此 smudge
命令。