2012-11-19 31 views
2

我已啓用$Id:$通過ident.gitattributes文件擴展。這使我可以在別人檢出我的存儲庫並從那裏安裝它時快速識別文件是否過期。更新登錄後的ident字符串

現在,我還將我自己的Git存儲庫的內容同步到其他(非開發,即無Git)系統。問題在於關鍵字擴展只發生在結帳,但我的工作流程是commit - > push - > sync,所以同步副本包含過時的ID。

如何在本地提交後輕鬆強制更新Ids? (積分爲之後的任何承諾自動做這個!)

簡單git checkout不工作(也不能與--force),可能是因爲該文件的內容並沒有改變。 git checkout-index --force也沒有。我只設法通過無論是本地的修改來完成這個(繁瑣,需要知道修改後的文件):

$ echo "modified" >> file 
$ git checkout file 

或臨時檢查出以前的承諾:

$ git checkout HEAD^ 
$ git checkout [email protected]{1} 
+0

你申請什麼filepattern此的ident屬性?以及包含多少個文件? –

+1

另外,一個提示(雖然這不能回答你的問題):你可以做'git checkout HEAD @ {1}',它會檢出HEAD的前一個值(http://git-scm.com/book/ EN /針對Git工具版本選擇#引用日誌 - 簡短名字)。它跟蹤分支值在.git/logs –

+1

我會建議在檢出文件時不要使用idents。它幾乎從來都不是正確的解決方案,並導致比解決問題更多的問題;相反,如果您需要跟蹤哪個修訂版與結帳相對應,那麼我會使用一個單獨的文件來跟蹤該文件,並且不會將其提交給git。例如,如果你有一個'sync'腳本,讓它將當前的commit-id寫入一個文件,然後在需要顯示的地方讀取該文件。 –

回答

0

這可以通過post-commit掛鉤完成。我已經通過腳本自動安裝,維護我的git-extensions repository的一部分:

$ git-ident-update --help 
Update the expansion of $Id$ to $Id:...$ via ident in the .gitattributes 
after a commit. 
To do this automatically in the future, invoke with --install. 
Usage: git-ident-update [--install|--uninstall|--status|--set [<path>[ <path> ...]]] [-?|-h|--help] 
1

這裏有一些建議:

git checkout --force .也許git checkout --force file.txt

如果這些命令中的一個工作,那麼你可以創建一個腳本.git/hooks/post-commit並且該腳本是一個調用該命令(或任何命令有效)的單線程,然後git會在每次提交時執行該操作。我相信鉤子腳本會自動將工作直接的根目錄(.git文件夾所在的位置)設置爲腳本的cwd。

編輯:

如果你運行touch file.txt; git checkout file.txt Git會做一個全面的檢出,包括應用的ident屬性,當我測試了一下。希望可以以某種方式使用

+0

不幸的是,'--force'沒有幫助。但感謝鉤的細節;我會嘗試。 –

+0

根據我對您的一般要求的理解,我會在這個問題的評論中嘗試Brian的建議。但是,我不確定我是否知道「同步」回購協議的含義。你的意思是你做了'git pull'嗎?或者你有其他系統將文件複製/ rsync到其他非git實例?對不起,沒有完全理解;儘管也許這並不重要。 –

+0

我通過Unison工具同步腳本(xcopy/rsync也可以)。我意識到ident的侷限性,並且通常推薦使用它,但它似乎非常適合我的用例。 –