2015-10-19 56 views
3

我在我的一些項目文件的頂部有一個小標題,我希望每次更改它們時都要更新當前年份。我在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)。

+0

你確定sed看到的文件名存在於它應該在哪裏嗎?過濾器似乎期望標準輸入上的文件內容,並且預計會寫入標準輸出。也許嘗試刪除'-i'和'%f'? (你也許想確保你不會修改遠離文件的任何東西) –

+0

@EtanReisner,放掉'-i'標誌似乎更像我想要的(反正錯誤消失了) 。我現在看到的問題是,日期更新作爲git歷史的一部分(我可以看到它添加到diff),但文件本身並未修改。 – njenson

+0

這不是過濾器所做的。他們顯式更改工作樹和存儲庫之間的數據。故意。這就是他們的目的。 –

回答

2

你在這裏有一些奇怪的事情,其中​​之一是你沒有像流一樣使用sedclean需要標準輸入運行它,並將該文件修改爲標準輸出。它更像是cat foo.txt | sed 's/foo/bar/'。所以不需要-i它會破壞事情。除此之外,我認爲git並不喜歡正則表達式,在這種情況下,通過更具體的方法可以做得更好。

[filter "updatedate"] 
    clean = sed "s/2011-20[01][0-9]/2011-$(date '+%Y')/" 

請注意,這不會改變你的本地副本,你將不得不拉來看到拉目錄的變化,從而smudge命令。