2015-12-01 61 views
2

衝突,我使用執行一個GitPython合併檢查合併:使用GitPython

repo.merge_tree(branch1, branch2) 

合併後,我想看看是否有任何合併衝突。我該怎麼做?

+0

我已經找到了這個問題的答案,但我有一個很難找到自己的答案。 [所以我發佈的問題和答案,我會找到幫助](http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ )。 – Kevin

回答

3

Nota buena:當我在自己的項目中嘗試過時,我不太能夠得到這個答案。我不確定是否因爲我在此答案中提供的信息不正確,或者是因爲我的代碼中存在其他問題。

無論如何,這個答案中的信息很難找到,我相信它是正確的或非常接近正確的,所以它仍然有用。請注意,當你使用這個建議時會有龍。


合併後,GitPython將工作目錄的狀態存儲在repo.index中。 repo.index包含一個方法index.unmerged_blobs,它可以讓你檢查每個blob(文件)的狀態,這些blob(文件)已經被修改但沒有被提交進行提交。 您可以迭代這些blob以查看是否有合併衝突。

每個blob都與從0到3(包括)的狀態相關聯。狀態爲0的Blob成功合併。合併後,狀態爲1,2或3的Blob發生衝突。


準確地說,所述index.unmerged_blobs函數返回文件路徑的字典來一個元組列表。每個元組包含一個從0到3的階段和一個blob。這是如何打破:

  • 字典中的每個鍵是項目中的其中一個文件的路徑。
  • 每個值實際上是修改密鑰引用文件的blob列表。這是因爲,在一般情況下,可能有多個更改會影響相同的文件。
    • 由值存儲的列表中的每個條目都是元組。
      • 元組中的第一個條目是blob的階段。合併後立即進入0階段意味着該blob沒有合併衝突。 1到3的階段意味着有衝突。
      • 元組中的第二項是blob本身。如果您選擇,您可以對其進行分析以查看blob原始內容的更改。爲了在問題中陳述的目的,您可以忽略斑點。

下面是一些代碼,以上設備結合起來:

# We'll use this as a flag to determine whether we found any files with conflicts 
found_a_conflict = False 

# This gets the dictionary discussed above 
unmerged_blobs = repo.index.unmerged_blobs() 

# We're really interested in the stage each blob is associated with. 
# So we'll iterate through all of the paths and the entries in each value 
# list, but we won't do anything with most of the values. 
for path in unmerged_blobs: 
    list_of_blobs = unmerged_blobs[path] 
    for (stage, blob) in list_of_blobs: 
    # Now we can check each stage to see whether there were any conflicts 
    if stage != 0: 
     found_a_conflict = true 
+0

我從這個緩存的Google網上論壇討論中獲得了大部分答案:http://webcache.googleusercontent.com/search?q=cache:WNqVZWPhBvAJ:https://groups.google。com/d/topic/git-python/SefBpTUNXVY +&cd = 8&hl = en&ct = clnk&gl = us – Kevin

+0

以及GitPython的API參考:https://gitpython.readthedocs.org/en/stable/reference.html#git.index .base.IndexFile.unmerged_blobs – Kevin