2017-06-16 92 views
0

我有2個git倉庫(例如A和B)具有類似的目錄結構,但在合併分支「DEV」期間,從A到B,我想排除特定的目錄/文件/目錄結構存在於A但不是在B中。合併兩個類似的GIT倉庫,但不包括特定的目錄

對於已存在於A和B中的每個文件,我想保留從repo B的版本我在每個包含這樣的目錄中都有一個.gitattributes文件文件,我爲每個文件包括一行,如routes-repo.ts merge=ours

目前我按照下面的過程:

  1. 運行git config merge.ours.driver true
  2. 在項目乙運行的根目錄git fetch A DEV
  3. 運行git fetch A DEV
  4. 運行git merge A/DEV
上面

確實同步存儲庫,但存在的所有新東西在項目A中也同步到回購B.同步只從A到B完成,但不是相反。

如何從同步中排除特定文件/目錄?

+0

因此,如果文件存在於A和B中,則保留B中的版本;並且你不希望文件在A中但不在B中(並且當前過程的問題是你正在獲得這些東西)......那麼你從A中獲取什麼信息? –

+0

理想情況下,我想將存在於A中的所有內容同步到回購B中,除了以下兩種情況。 1.蘇氨酸的文件,我包括.gitattributes文件(這一個工程) 2.中存在的特定文件或目錄,但我不希望他們出現在例如B.我在我的項目命名爲DIR1的根本是不存在的B.我想找到一種方法,說的根目錄忽略合併過程中DIR1。不知道.gitignore是否會滿足這一點。 – yian

回答

0

顯然,看着你的工作樹在一次文件,有三種情況:

1)同時存在於兩個回購,但是你想從回購B中的版本文件;你有這樣的解決方案

2)某些只存在於A中的文件,你想要退出合併;你不必爲要不然這又

3)一切的解決方案,它可以合併通常

所以重點(2),你不知道(在評論)如果的.gitignore會有所幫助。它不會。忽略規則隻影響git如何處理未跟蹤文件;它不會對合並做任何事情。

由於文件不存在於回購B中,因此不會有文件合併,因此使用.gitattributes設置合併處理程序也不起作用。

那麼工作?

您可以使用--no-commit選項發出merge命令。

git merge --no-commit A/DEV 

這將初步完成合並正是現在的樣子,但它不會自動生成一個合併提交。相反,它會停下來,讓你做任何你想要的改變。所以

git rm -r a/directory/you/wanted/to/exclude 
# ... etc 
git commit 

你可能更喜歡更自動的東西,特別是如果合併將重複進行。我沒有一個完美的解決方案。您可以期望在第1次合併期間刪除的文件應該「保持刪除」,但如果Repo A對文件進行了進一步更改,您將會遇到合併衝突。 (您可以嘗試在工作樹根中的.gitattributes文件中包含一個像a/directory/you/wanted/to/exclude/**/* merge=ours這樣的路徑;這可能會有所幫助。)

但是,如果回購A在合併之間的這些目錄中創建新文件,那麼您又回到了不得不手動刪除合併過程中的文件(因爲git認爲是文件而不是目錄)。

你可能建立在回購B中的合併鉤,至少提醒你需要清理的時候。

+0

謝謝您的解決方案聽起來合乎邏輯。我會嘗試一下,如果可能的話,會嘗試在一定程度上自動化。如果我設法實現它,我會在這裏發佈它。 – yian

+0

自動化的地步,我想這些命令的工作方式,在運行'合併--no提交一個shell腳本...',那麼'git的RM ...',那麼'混帳commit'會*或多或少*做這項工作;錯誤處理是我看到的陷阱 –