我在我的一些項目文件的頂部有一個小標題,我希望每次更改它們時都要更新當前年份。我在Git中與我的清潔過濾器的一個問題拋出一個錯誤:在git上更新文件添加乾淨的過濾器和sed
首先,我有一個文件在我的主分支稱爲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)。
你確定sed看到的文件名存在於它應該在哪裏嗎?過濾器似乎期望標準輸入上的文件內容,並且預計會寫入標準輸出。也許嘗試刪除'-i'和'%f'? (你也許想確保你不會修改遠離文件的任何東西) –
@EtanReisner,放掉'-i'標誌似乎更像我想要的(反正錯誤消失了) 。我現在看到的問題是,日期更新作爲git歷史的一部分(我可以看到它添加到diff),但文件本身並未修改。 – njenson
這不是過濾器所做的。他們顯式更改工作樹和存儲庫之間的數據。故意。這就是他們的目的。 –