2017-06-15 70 views
0

我有一個包含5個子文件夾的git的目錄特定子文件夾的內容:始終覆蓋

  • 我的項目
    • 文件夾1
    • 文件夾2
    • 文件夾3
    • 文件夾4
    • 文件夾5

允許像往常一樣合併文件夾1至4的內容。但是,每次都必須覆蓋文件夾5中的所有內容,而不是合併。沒有例外。有沒有一種方法可以修改.gitattributes文件以使其自動發生?

+0

爲什麼它總是被覆蓋? – axiac

+0

裏面的文件是專有的,如果與其他版本的文件合併,將無法在其本機軟件中正常工作。 –

回答

0

UPDATE - 一對夫婦的想法,我要補充...

另一個下側的「合併驅動程序」的做法是,我敢肯定你得(部分),將其設置因爲我不認爲必要的配置設置將被push/fetch操作共享。你可以通過使用默認的binary合併驅動程序來避免這個問題(儘管在這種情況下,不是「試圖做正確的事情」,git會告訴你任何時候在該目錄中需要文件級合併都會產生衝突;這仍然是一個逐個文件的解決方案)。

而且這也指出這是一個客戶執行的計劃;如果你需要一個硬策略,服務器端的post-receive hook可能更合適。 (實際上,兩者的結合可能值得考慮,以避免意外的違規行爲發生時間過長而難以修復)。但問題在於,定義了一個鉤子來區分這個「壞」推子和這個「好」推子情況可能並不那麼簡單。


原始響應

我能想到的是定義一個定製的合併驅動器和使用.gitattributes最好的。但這並不是很好 - 可能會出現一些情況,其行爲不符合您的預期。

假設你有

R --- A <--(master) 
\ 
    B <--(branch) 

AB每修改一個文件的子目錄。所以合併branchmaster,如果你想保留從B(從分支覆蓋)的版本,你會做到以下幾點。 (我會重新訪問這些步驟,你將如何保持master的版本......)

在存儲庫配置,自定義一個合併類型

[merge "theirs"] 
     name = Keep 'Their' Version 
     driver = cp %B %A 

然後創建一個.gitattributes文件在你的工作樹根,你會添加並提交

Folder5/* merge=theirs 

(或者,如果有子目錄也需要這種處理,

Folder5/**/* merge=theirs 

改爲。)

現在,當您合併包含Folder5中文件更改的分支時,將進行這些更改; 「我們的」分支中的相同文件(例如「合併branchmaster」中的master側)的任何改變(衝突或其他)將被忽略。

無論其,如果一個特定的文件是不變branch,然後在master任何更改都將採取。這是在逐個文件的基礎上確定的;因此,如果master修改Folder5/file1Folder5/file2,但branch僅修改Folder5/file1,然後合併結果將有masterfile2branch版本的file1。另外,如果你有過「長壽命」的分支,並且做了「向後合併」以防止它們不同步,向後合併的(可能是無聲的)默認值將覆蓋分支中的更改與master的變化。

因此,根據您的工作流程,這可能會讓git默認情況下更頻繁地做「正確的事情」,但它也可能會創建一些出乎意料和有害的情況。

如果您想保留主版本,該怎麼辦?

那麼,你可以定義合併司機有點不同

[merge "ours"] 
     name = Keep 'Our' Version 
     driver = true 

(你真的只是在做無操作與此驅動程序;在以前的版本我建議touch %A爲「相對無害」,但這避免甚至調整的時間戳。)

,當然還有.gitattributes進入會說merge=ours

同樣,這纔會生效,當一個文件實際上是受合併影響。所以這意味着branch上的更改將被忽略如果相同的文件在master上有更改。

另一方面(我猜),在這種情況下,「向後合併」長壽命分支可能不太麻煩。

+0

僅供參考,您可以使用'true'作爲無操作驅動程序 - 無需更新日期戳。然而,只有在「雙方」有變化的情況下,司機纔會運行的事實是(我認爲)這裏的主要問題。 – torek

+0

嗯。那麼,你說'真的'是對的。我不確定它是否很重要(因爲通常您不希望合併保留時間戳),但我會相應地更新。正如我所指出的那樣,「非合併」案件無疑給了我這種方法最多的停頓;但我認爲我可能會提供它,以防OP對他的用例感覺比什麼都好,特別是因爲我根本不知道更好的方法來近似所請求的內容 –