2015-04-12 79 views
0

有沒有辦法確定哪些文件被'git merge'成功自動合併AFTER用戶解決了文件衝突並執行了git add/commit?如果任何成功自動合併的文件都由用戶在同一次提交中更新,那麼也很高興知道這一點。我有一個預接收鉤子,只需要在手動合併的文件上運行。如何獲得git自動合併文件列表

+0

你可以更精確地定義這個嗎?假設例如我在提交'x'上,並運行'git merge sha1-of-y'併產生合併提交'z',其中'x'和'y'的合併基礎是'b'。如果提交已經完成,我們甚至不知道哪些文件需要手動合併步驟,但是,假設從「b」到「x」文件「f」沒有變化,而從「b」到「y」文件'f' *被改變了,所以'z:f'匹配'y:f'。鑑於從b:f到'x:f'沒有任何變化,是否成功實現了自動合併? – torek

+0

感謝您的幫助,Torek。這裏是場景 - 用戶執行'branchA'的簽出,然後'git合併branchB'。我成功自動合併的定義是任何不會導致碰撞的東西。 T – user2577365

+0

感謝您的幫助,Torek。這裏是場景 - 用戶執行'branchA'的簽出,然後'git合併branchB'。我成功自動合併的定義是任何不會導致碰撞的東西。要回答你的問題,只要git能夠執行合併,那麼是的,出於我的目的,我會認爲這是一個成功的自動合併。我試圖限制當執行「推送」時(耗時)預接收鉤子必須處理的文件數量。在我的場景中,鉤子只需要在用戶執行'git add'的文件上運行。希望這是有道理的。 – user2577365

回答

2

確定的基礎上,明確的意見,我會說,有沒有完美的答案,但你可以得到一個近似,即通過簡單地重複合併足夠也許是好事,有--no-commit,以防止在完成合並,然後使用git ls-files -u發現哪些文件是當前未合併:

$ git checkout <first-commit-id> 
[output indicates detached HEAD] 
$ git merge --no-commit <second-id> 
[output includes any merge issues] 
$ git ls-files -u 

git ls-files實際輸出取決於合併衝突。例如,用修改/修改合併衝突(在fileB):

100644 7531cd0643738673e94e850c07a681aedd008bca 1 fileB 
100644 85159a3450148691cd6eec96eb06263240990850 2 fileB 
100644 bbf71554709c5a9ae8d253b8e15270534f40e3f7 3 fileB 

但重命名/刪除衝突(fileB更名爲fileE在「主」分支,但在「邊」分支是merged-刪除in):

100644 7531cd0643738673e94e850c07a681aedd008bca 2 fileE 

(這裏在這種情況下沒有階段1或3變體)。還可以進行其他組合:請參閱git read-tree documentation,並特別注意「3向合併」部分。

一旦你得到git ls-files -u的輸出(如果所有東西都合併乾淨,只要git可以告訴 - 這並不意味着合併是正確的,如果git的語義真的錯了,它甚至可能是完全垃圾 - 但它是什麼混帳可以做自動現在,這大概是一樣什麼混帳可以做自動然後爲好),中止正在進行的合併,並恢復適當的分支:

$ git merge --abort 
$ git checkout <original-branch> 

如果(「預-receive hook「暗示)這一切都是在--bare存儲庫中完成的,您需要一個臨時工作樹(或整個克隆)來執行合併,我沒有時間去實驗wi這裏。

有問題的兩個SHA-1,你需要git checkout,只是合併的兩個父母。 (注意,這一切都假定一個2父合併:合併章魚是右出)

如果執行合併的人曾與-s ours或一些-X選項運行,這將不會重複他們做了什麼,並可能給你一個無用的答案,這就是爲什麼這是不完美的任何手段。不過,我懷疑這是最好的,你可以完全自動化。 (也請注意,如果您想要一些可能有意義的細微變化,您可能需要單獨使用git read-tree -m而不是完整的git merge。這只是基於我的「懷疑意圖」,我也認爲無論你提出的是什麼,最好都可能具有邊際效用,並且你可能會更好,只需讓用戶在推送之前自行檢查它們。)

+0

Torek,感謝您花時間提供這樣一個徹底的答案......非常感謝。 – user2577365