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
?
为了查找特定提交的重复项,这可能对您有用.
首先,确定目标提交的补丁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秒).