git查找重复提交(通过patch-id)

bsb*_*bsb 9 git commit duplicates

我想要一个找到重复变化的方法.patch-id可能是相同的,但提交属性可能不是.

这似乎是patch-id的预期用途:

git patch-id --help

IOW,你可以使用这个东西来寻找可能的重复提交.

我想把"git log","git patch-id"和uniq串在一起可以很好地完成这项工作,但是如果某人有一个能很好地完成工作的命令,我会很感激.

rob*_*nst 11

因为重复的更改可能不在同一个分支上(除非它们之间有恢复),您可以使用git cherry:

git cherry [-v] [<upstream> [<head> [<limit>]]]
Run Code Online (Sandbox Code Playgroud)

upstream检查重复更改的分支在哪里head


Sli*_*son 9

为了查找特定提交的重复项,这可能对您有用.

首先,确定目标提交的补丁ID:

$ THE_COMMIT_REF_OR_SHA_YOURE_SEEKING_DUPES_OF='7a3e67c'
$ git show $THE_COMMIT_REF_OR_SHA_YOURE_SEEKING_DUPES_OF | git patch-id
f6ea51cd6acd30cd627ce1a56e2733c1777d5b52 7a3e67ce38dbef471889d9f706b9161da7dc5cf3
Run Code Online (Sandbox Code Playgroud)

第一个SHA是patch-id.接下来,列出每个提交的补丁ID并过滤掉任何匹配:

$ for c in $(git rev-list --all); do git show $c | git patch-id; done | grep 'f6ea51cd6acd30cd627ce1a56e2733c1777d5b52'
f6ea51cd6acd30cd627ce1a56e2733c1777d5b52 5028e2b5500bd5f4637531e337e17b73f5d0c0b1
f6ea51cd6acd30cd627ce1a56e2733c1777d5b52 7a3e67ce38dbef471889d9f706b9161da7dc5cf3
f6ea51cd6acd30cd627ce1a56e2733c1777d5b52 929c66b5783a0127a7689020d70d398f095b9e00
Run Code Online (Sandbox Code Playgroud)

所有这些都带有一些额外的标志,并以实用程序脚本的形式:

test ! -z "$1" && TARGET_COMMIT_SHA="$1" || TARGET_COMMIT_SHA="HEAD"

TARGET_COMMIT_PATCHID=$(
git show --patch-with-raw "$TARGET_COMMIT_SHA" |
    git patch-id |
    cut -d' ' -f1
)
MATCHING_COMMIT_SHAS=$(
for c in $(git rev-list --all); do
    git show --patch-with-raw "$c" |
        git patch-id
done |
    fgrep "$TARGET_COMMIT_PATCHID" |
    cut -d' ' -f2
)

echo "$MATCHING_COMMIT_SHAS"
Run Code Online (Sandbox Code Playgroud)

用法:

$ git list-dupe-commits 7a3e67c
5028e2b5500bd5f4637531e337e17b73f5d0c0b1
7a3e67ce38dbef471889d9f706b9161da7dc5cf3
929c66b5783a0127a7689020d70d398f095b9e00
Run Code Online (Sandbox Code Playgroud)

它并不是非常快速,但是对于大多数repos来说应该完成工作(对于一个拥有826次提交的repo,以及一个2.4MB Core 2 Duo上的158MB .git dir,仅测量36秒).