我的一些项目文件顶部有一个小标题,我想确保每当我对它们进行更改时都会使用当前年份进行更新。我在git中使用clean过滤器时出现问题,导致错误:
首先,我的主分支上有一个名为testClass.cs
的文件:
// *********************
// File active 2011-2014
// *********************
然后我对文件进行了一些小改动:
// *********************
// File active 2011-2014
// *********************
// First commit, wahoo!
然后我运行git add testClass.cs
来为下一次提交暂存更改。这将运行我的git clean过滤器,它使用sed
尝试编辑文件以将标题中的年份更新为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
我遇到的问题是,由于"设备或资源繁忙而导致添加/更新失败"错误。似乎与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)。
答案 0 :(得分:2)
这里有一些奇怪的事情,一个是你没有像流一样使用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
命令。