2011-10-13 21 views
2

這是一個過程問題,因此可能有多個正確的答案。不過,我會採取任何我現在擁有的東西。不斷合併Mercury中的.hgignore

我的團隊最近已經轉而使用水銀(從Subversion),並在大多數情況下,我們喜歡新的動力。但是,有一些東西會降低生產力。其中之一就是管理.hgignore文件。

根據既定的文獻和「互聯網上的一些人」:)的建議,我們的團隊保持.hgignore文件最新,以便hg addremove始終做正確的事情。此外,缺少需要添加的文件是造成構建失敗的首要原因,所以hg st僅返回真正需要操作的文件是非常重要的。

的問題是,因爲我們總是添加新的忽略到文件的底部,它總是會導致一個合併衝突如果兩個人做.hgignore變化。 (大多數人使用TortoiseHg客戶端,這會添加到文件末尾。)這樣做的結果是大約一半的時間文件被更改,更改它的人必須處理合並.hgignore。這感覺很像是不得不與我們的源代碼控制的內部進行交互。

這是造成開發商不希望將文件添加到.hgignore,因爲他們知道這將需要以最低的幾個附加分鐘來處理。我們有一個相當大的項目,有一個相當大的團隊正在不斷變化。新的構建工件被相當有規律地引入,所以問題似乎沒有消失。 .hgignore並不是很穩定,因爲這個項目正在改變很多。 (這本身就是一個不同的問題,當然。)

「正確」的事情是「採取雙方」幾乎總是。從技術上講,兩個人可能已經用文本編輯器修改了完全相同的前一行,但這是不太可能的。不太可能的是,即使'採取兩個'方法失敗,後果也很小。

因此,我把問題提交給社區:我該如何改善這種情況?是否有流程改變可以緩解這種情況?是否有一種工具可以自動採取雙方?我能否以某種方式自動化合並?是否有一個複選框,我可以檢查神奇地解決問題:)?

編輯1:下面是我當前的.hgignore(顯然是編輯版)的版本。您可以輕鬆觀察到正在使用多種不同的技術。代碼的幾個部分正處於從一種技術轉換到另一種技術(例如VB到C#)的過程中。這會導致一組構建工件發生更改,並且需要更新文件。

syntax: glob 
*.obj 
*.tds 
*.map 
*.il? 
*/obj/* 
*/lib/* 
*/pch/* 
Foo/Engine/frezbat/DocFiles.hpp 
Foo/Engine/personal_defines.h 
Foo/Engine/revision.cpp 
Foo/Engine/frobbish/uLinkHlp.hpp 
Foo/Engine/dll/XMLData/**.xml 
Foo/Engine/dll/*.syslog 
Foo/Engine/dll/*.log 
Foo/Engine/dll/Scripts 
Foo/Engine/dll/Linked Models 
Foo/Engine/dll/prv 
Foo/Engine/dll/pub 
Foo/Engine/dll/failures.txt 
Foo/Engine/dll/users.prm 
Foo/Engine/tools/SrvIface/**.dll 
Foo/Engine/tools/SrvIface/**.exe 
*/dll/*.ini 
*/dll/*.exe 
*/dll/*.dll 
*/quux_obj/* 
*.dbg 
*~ 
scripts/backupPath.txt 
*.local 
*.orig 
FooDoc/FooDoc/bin/* 
FooDoc/FooDoc/FooDoc.suo 
FooDoc/FooDoc/FooDoc.vbproj.user 
FooDoc/FooDoc_Setup/Release 
Foo/Engine/dll/FooObjects.pdb 
Foo/Engine/dll/FooObjects.tlb 
Foo/Engine/dll/FooObjects.xml 
Foo/Engine/dll/InitechDebugTimer.txt 
*.dsk 
Foo/Engine/dll/Preferences/CustomToolbar.ini 
Foo/Engine/Engine.~dsk 
Foo/Engine/dll/ApplicationSettings.fooprefs 
Foo/Engine/dll/Foo.cgl 
Foo/Engine/dll/IniShare.mem 
Foo/Engine/baz_obj/* 
Foo/Engine/baz_pch/* 
*/dll/*.drc 
*.~dsk 
InitechBaz/InitechBaz/bin/Debug/InitechBaz.vshost.exe.manifest 
InitechBaz/InitechBaz/bin/Debug/InitechBaz.vshost.exe.config 
InitechBaz/InitechBaz/bin/Debug/InitechBaz.vshost.exe 
InitechBaz/InitechBaz/bin/Debug/InitechBaz.exe.config 
scripts/TestComplete/Ottertech_Replay/Log/* 
scripts/TestComplete/Ottertech_Replay/[* 
relre:ReSharper* 
relre:_UpgradeReport_Files 
glob:*.suo 
glob:*.pdb 
*.swp 
Foo/Engine/FooObjects/FooObjects/bin/x86/ 
FooDoc/MCtoDAT/MCtoDAT/bin/x86 
FooDoc/Deploy 
Foo/Engine/installers/initech-build/bin/* 
scripts/TestComplete/Users/* 
Foo/Engine/dll/MCtoDAT.xml 
FooDoc/Deploy/* 
scripts/TestComplete/Ottertech_Replay/Log/* 
scripts/TestComplete/Ottertech_Replay/[* 
*.orig 
Foo/Engine/installers/icon-installers-bin/* 
Foo/Engine/Quux/Server/*.esp 
Foo/Engine/Quux/BrapServer/*.esp 
Foo/Engine/installers/bin/*.exe 
Foo/Engine/installers/quux/encryptedsql/*.esp 
Foo/Engine/tools/tempfile.tmp 
*.pch 
*.#* 
*.#?? 
Foo/Engine/dll/frabbing.lib 
re:^.*\.\#[0-9][0-9]$ 
Foo/Engine/Foo/FooObjects/FooObjects/FooObjects.xml 
FooDoc/MCtoDAT/MCtoDAT/MCtoDAT.xml 
*.sln.cache 
FooDoc/TestFooObj/TestFooObj/bin/ 
*.user 
Foo/Engine/FooObjects/FooObjects/FooObjects.xml 
Foo/Engine/FooObjects/FooObjects/FooObjects.xml 
FooDoc/MCtoDAT/MCtoDAT/MCtoDAT.xml 
*/Debug Installer/*.dll 
*/Debug Installer/*.tlb 
*/Debug Installer/*.xml 
*/Debug Installer/*.msi 
*/Debug Installer/*.exe 
FooDoc/FooDoc_Setup/Debug/* 
re:(?i).*\/UpgradeLog.xml 
*.sln.cache 
+5

你一直在對該文件進行什麼樣的更改?這個文件真的非常罕見。 –

+0

我發佈了文件,以便您可以看到。部分原因在於許多領域正在經歷工具和技術變革。從理論上講,這最終應該會結束,但到那時,我們可能會在不同的領域做類似的事情。 – alficles

+0

好吧,除了壓縮它,例如結合所有bin,obj和.tmp目錄和文件夾等,那麼我想你將不得不保持合併。超越比較是一個非常好的合併工具(在我看來),它有一個「採取行動,然後採取正確的行動」。不是自動的,但很容易做到。可能值得一看。 –

回答

3

通常在項目開始時忽略文件會發生一系列變化,但它會很快穩定下來。我猜你沒有有效地使用通配符。如果您無法考慮如何在您的情況下使用通配符,則可能需要構建代碼,以便新創建的忽略文件全部進入一個目錄。例如,將所有構建工件放入「構建」目錄中。在構建腳本中,這是一個更前沿的工作,但也有助於選項卡完成,因爲源目錄中只有源文件。

+0

這實際上是我最初設想的。我想,隨着所有構建工件被添加到忽略中,它會很快冷靜下來。另外,關於構建目錄你有一個很好的觀點。改進這個過程就在我們的路線圖上,但是能夠在短期內實現我們可以實施的解決方案會很好。 我注意到隨着項目的開發,不斷增加新的構建工件,所以安置不會像我期望的那樣發生。 – alficles

+2

這就是我懷疑的,也許OP可以發佈摘錄,所以我們可以用glob和或正則表達式來擴展這個答案來匹配它們。 –

+0

唉,看起來答案真的是「吸引和處理」。雖然不令人滿意,但至少我不知道要花費一大堆時間。感謝您的幫助。 – alficles

2

移動生成根以外的回購樹並獲得建設者的來源作爲hg export的結果。這樣你就可以一舉兩得

  • 構建對象將在資源庫中不亂丟
  • 可以驗證所有需要文件在倉庫
0

像任何工具,Mercurial只能走得這麼遠。正如之前所指出的,大多數項目結構在一段時間後會趨於穩定,從而使您的問題在標準用例中與您自己的問題相關性較低。

就你而言,很可能你必須忍受這一點。

另一種方法是重構項目,使所有可忽略的文件位於同一位置,否則可通過通配符模式進行修改。如果圖中唯一的力量是需要緩解忽略管理問題,我傾向於反對。換言之,源控制系統的特殊性或侷限性不應成爲決定項目結構的力量。

也就是說,通常有真正的力量來產生一個穩定的項目結構,這種力量超越了資源控制。例如,開發人員需要熟悉該項目,而不斷的變化會影響熟悉程度。顯然不適合你,因爲你有源代碼被忽略。

我知道這不會回答你的問題,但我覺得問題在於源控制之外,並且在你的項目中,那些其他的力量已經不再施加影響。