2010-01-13 37 views
15

的我正在考慮從顛覆與git遷移。我們使用Subversion爲我們的系統管理員管理配置文件之類的東西之一。爲此,我們將$URL$放入每個文件中,該文件展開到顛覆樹中文件的位置。這可以讓管理員查看某個任意主機上的文件,並找出它來自哪棵樹的哪個位置。

我能找到的最接近的模擬是gitattributes。有filter=指令,但似乎git沒有向過濾器傳遞它正在過濾的文件名,這將需要將$URL$轉換爲路徑。

還有ident指令,它會將$Id$轉換爲blob散列。如果可以將其映射回路徑名,這可能是可用的,但是我的git-fu不夠強大。

有什麼建議嗎?

的工作流程如下:

  1. 管理員提交更改VCS回購
  2. 管理員更新已簽出的回購
  3. 聯繫拉更改使用的cfengine
  4. 主機的中央位置
+0

當你說路徑,則它主要用來識別一個分支或分支內的實際路徑? – 2010-01-13 20:50:25

+0

我的意思是文件的路徑名。所以如果一個管理員查看'/ etc/apache2/sites-available/trac'文件,他會發現他可以在VCS中找到這個文件爲'https://eng.svn.pdaverticals.com/trunk/net/HTTP/Apache2的/網站/ trac'。否則,他必須找到並且希望文件名匹配,它可能不匹配,因爲有些文件在發送到主機時會得到不同的名稱,有些文件是由大量不同的文件碎片組成的,甚至在VCS中也有一個模擬器。 – Rudedog 2010-01-13 23:01:30

回答

6

"Does git have anything like svn propset svn:keywords or pre-/post-commit hooks?"提到的,GIT中不支持關鍵字擴展。

Dealing with SVN keyword expansion with git-sv」提供了一個基於git config filter(這不完全是你想要的)和/或gitattributes的解決方案。


如果文件信息擴展我發現它仍然基於塗抹/清潔方法,with this git Hash filter,但乾淨的部分從文件中刪除,而沒有一條路可以找到的最接近的例子。

This thread實際上闡明它(以及提一些混帳福命令可能包含你正在尋找什麼,我沒有測試過):

不管怎樣,塗抹/清潔不給立即解決問題,因爲更小的技術缺陷:

  • 塗抹過濾器未通過文件的名稱被檢查出來,所以這是不可能準確找到承諾標識符。
    然而,這是一個事實,即「塗抹」只被運行修改過的文件,所以最後提交所需要的一個緩解。

  • 污跡濾波器不通過提交標識符。這有點嚴重,因爲這些信息無處可逃。
    我試圖用「HEAD」價值,但顯然還沒有在此刻「塗抹」更新正在運行,因此文件結束了的「上一個」日提交,而不是提交被檢查出來。
    「Previous」表示之前簽出的提交。如果不同的分支正在結帳,問題會變得更糟,因爲這些文件會獲得先前分支的時間戳。

AFAIR,缺少污跡過濾器中的信息是故意的,以阻止這種特殊的污跡/清潔機制的使用。不過,考慮到Peter的用例,我認爲可以重新考慮這一點:「僅限結賬」工作區,用於立即發佈到網絡服務器。
或者,對此用例感興趣的任何人都可以將附加的塗抹參數作爲站點本地修補程序實施。

然後,有一些小的煩惱,這似乎是不可避免的:如果您更改'乾淨'的過濾器並檢查出早期版本,它會被報告爲有修改(由於更改'乾淨'的定義)。

+0

我已經閱讀並打折了前兩個鏈接,因爲他們都沒有做我正在尋找的東西。我也知道gitattributes,我認爲我已經通過我在文章中引用它們的事實表明了這一點。 – Rudedog 2010-01-13 20:03:18

2

從完全不同的角度來看這個問題,最終主機上的文件如何結束?我想現在它會直接在那裏檢查出來,或者以某種方式從另一個主機上已經檢出的存儲庫中複製出來?

如果是這樣,你可以修改你的過程,這樣的文件簽出到一個Git倉庫,經過結賬腳本執行$URL$或其他關鍵字擴展。這樣你就可以做任何你喜歡的替換,並且只受限於在檢出的存儲庫中通過腳本可以發現的內容。

+0

+1。更接近我所知道的生產環境:您不希望終端主機上有任何VCS工具。中間環境更安全。 – VonC 2010-01-13 22:03:21

+1

我們擁有一個擁有VCS只讀結賬的主管理員服務器。我考慮過在結賬後做編輯,但問題是git認爲所有的文件都被修改了,隨後的git pull會失敗。 我也想過使用git-archive刷新中央臨時區域,但這會導致文件時間戳等變化的各種問題。 – Rudedog 2010-01-13 22:57:28

+1

我同意,這不是最優的。它可以工作,通過做一些接近'git reset --hard; git pull;替代品;部署文件「,但仍然不是你想要的。 :) – 2010-01-14 09:14:32

1

我們在部署中使用「規範路徑」解決方案(它們都是內部FWIW)。

所有軟件都進入例如/d/sw/xyz/a.cd:\ SW \ XYZ \交流轉換器

所有URL到展開文件反映例如http://host/d/sw/xyz/a.c

存儲庫文件的URL以「sw」開頭。 的git:// githost/gitrepo/XYZ/AC

我們在編碼的配置(它應該永遠需要改變),這些規範的路徑,我們有腳本/ API,這些API生成/參考上飛的網址組件之間的動態鏈接。

4

由於時下有%f選項,像git-rcs-keywords這樣的腳本可以完成這項任務。

它已在this answer中提及。

gitattributes(5) manpage

Sequence "%f" on the filter command line is replaced with 
the name of the file the filter is working on. A filter 
might use this in keyword substitution. For example: 

[filter "p4"] 
    clean = git-p4-filter --clean %f 
    smudge = git-p4-filter --smudge %f 
+0

現在,git過濾器應該啓動更多的git命令來希望提取一些信息(並且提交哈希將不可能提取)git已經有了......這是真正加速的東西......它不是更好的是後分支的鉤子:-( – 2013-02-14 09:54:50