如何判断合并后是否有重复的东西?

时间:2016-04-08 12:40:59

标签: git github

我有这个脚本在GitHub.com上合并之后清理本地git分支。它会运行git checkout master && git pull origin master && git branch --merged以获取可以立即删除的本地分支列表。

如果我将分支推送到GitHub并使用"Confirm squash and merge"功能。当我运行上述相同的命令(git branch --merged)时,这些命令将不会显示。

2 个答案:

答案 0 :(得分:1)

Merge-squash会从分支添加更改,而不会将其标记为已合并。所以你可以尝试寻找相同的变化。您可以使用git patch-id命令执行此操作。对于单个分支B,它应该类似于:

branch_id=$(git diff origin/master...B | git patch-id)
git rev-list --max-parents=1 B..origin/master \
  | while read hash; do commit_id=$(git show "$hash" | git patch-id); if test "$commit_id" = "$branch_id"; then <do what you planned to do with the branch>; break; fi; done

如果你有很多分支,你可以考虑添加一些缓存,以避免多次为同一次提交计算patch-id。

答案 1 :(得分:0)

实际上,您可以从github API检查pullrequest是否已合并,并认为该分支也已合并。

因此,例如,如果您想知道存储库https://github.com/JetBrains/gitextensions中的哪些分支已合并到https://github.com/gitextensions/gitextensions,您向https://api.github.com/repos/gitextensions/gitextensions/pulls?state=closed发出请求,然后使用此类代码选择合并的分支(python2):

import curl
import json

c = curl.Curl()
content = c.get('https://api.github.com/repos/gitextensions/gitextensions/pulls?state=closed')

d = json.decoder.JSONDecoder()
c_parsed = d.decode(content)

for pr in c_parsed:
    if pr[u'head'][u'repo'] is not None and pr[u'head'][u'repo'][u'full_name'] == u"JetBrains/gitextensions":
        print pr[u'head'][u'ref']