我有一個包含5個子文件夾的git的目錄特定子文件夾的內容:始終覆蓋
- 我的項目
- 文件夾1
- 文件夾2
- 文件夾3
- 文件夾4
- 文件夾5
允許像往常一樣合併文件夾1至4的內容。但是,每次都必須覆蓋文件夾5中的所有內容,而不是合併。沒有例外。有沒有一種方法可以修改.gitattributes文件以使其自動發生?
我有一個包含5個子文件夾的git的目錄特定子文件夾的內容:始終覆蓋
允許像往常一樣合併文件夾1至4的內容。但是,每次都必須覆蓋文件夾5中的所有內容,而不是合併。沒有例外。有沒有一種方法可以修改.gitattributes文件以使其自動發生?
UPDATE - 一對夫婦的想法,我要補充...
另一個下側的「合併驅動程序」的做法是,我敢肯定你得(部分),將其設置因爲我不認爲必要的配置設置將被push/fetch操作共享。你可以通過使用默認的binary
合併驅動程序來避免這個問題(儘管在這種情況下,不是「試圖做正確的事情」,git會告訴你任何時候在該目錄中需要文件級合併都會產生衝突;這仍然是一個逐個文件的解決方案)。
而且這也指出這是一個客戶執行的計劃;如果你需要一個硬策略,服務器端的post-receive hook可能更合適。 (實際上,兩者的結合可能值得考慮,以避免意外的違規行爲發生時間過長而難以修復)。但問題在於,定義了一個鉤子來區分這個「壞」推子和這個「好」推子情況可能並不那麼簡單。
原始響應
我能想到的是定義一個定製的合併驅動器和使用.gitattributes
最好的。但這並不是很好 - 可能會出現一些情況,其行爲不符合您的預期。
假設你有
R --- A <--(master)
\
B <--(branch)
和A
和B
每修改一個文件的子目錄。所以合併branch
到master
,如果你想保留從B
(從分支覆蓋)的版本,你會做到以下幾點。 (我會重新訪問這些步驟,你將如何保持master
的版本......)
在存儲庫配置,自定義一個合併類型
[merge "theirs"]
name = Keep 'Their' Version
driver = cp %B %A
然後創建一個.gitattributes
文件在你的工作樹根,你會添加並提交
Folder5/* merge=theirs
(或者,如果有子目錄也需要這種處理,
Folder5/**/* merge=theirs
改爲。)
現在,當您合併包含Folder5
中文件更改的分支時,將進行這些更改; 「我們的」分支中的相同文件(例如「合併branch
到master
」中的master
側)的任何改變(衝突或其他)將被忽略。
無論其,如果一個特定的文件是不變在branch
,然後在master
任何更改都將採取。這是在逐個文件的基礎上確定的;因此,如果master
修改Folder5/file1
和Folder5/file2
,但branch
僅修改Folder5/file1
,然後合併結果將有master
版file2
和branch
版本的file1
。另外,如果你有過「長壽命」的分支,並且做了「向後合併」以防止它們不同步,向後合併的(可能是無聲的)默認值將覆蓋分支中的更改與master
的變化。
因此,根據您的工作流程,這可能會讓git默認情況下更頻繁地做「正確的事情」,但它也可能會創建一些出乎意料和有害的情況。
如果您想保留主版本,該怎麼辦?
那麼,你可以定義合併司機有點不同
[merge "ours"]
name = Keep 'Our' Version
driver = true
(你真的只是在做無操作與此驅動程序;在以前的版本我建議touch %A
爲「相對無害」,但這避免甚至調整的時間戳。)
,當然還有.gitattributes
進入會說merge=ours
同樣,這纔會生效,當一個文件實際上是受合併影響。所以這意味着branch
上的更改將被忽略如果相同的文件在master
上有更改。
另一方面(我猜),在這種情況下,「向後合併」長壽命分支可能不太麻煩。
僅供參考,您可以使用'true'作爲無操作驅動程序 - 無需更新日期戳。然而,只有在「雙方」有變化的情況下,司機纔會運行的事實是(我認爲)這裏的主要問題。 – torek
嗯。那麼,你說'真的'是對的。我不確定它是否很重要(因爲通常您不希望合併保留時間戳),但我會相應地更新。正如我所指出的那樣,「非合併」案件無疑給了我這種方法最多的停頓;但我認爲我可能會提供它,以防OP對他的用例感覺比什麼都好,特別是因爲我根本不知道更好的方法來近似所請求的內容 –
爲什麼它總是被覆蓋? – axiac
裏面的文件是專有的,如果與其他版本的文件合併,將無法在其本機軟件中正常工作。 –