Ren*_*ink 5 git git-tag git-branch
让我们假设你在git中有以下结构
A <-- refs/heads/somebranch
|
B
| \
C D <-- refs/tags/TAG1
| |
E F
| | \
G H I <-- refs/heads/branch1
|
J <-- refs/heads/master
Run Code Online (Sandbox Code Playgroud)
现在我想B在历史记录中找到包含提交的所有引用.
如果我能这样做会很好
$ git refs --contains B
refs/tags/TAG1
refs/heads/branch1
refs/heads/master
Run Code Online (Sandbox Code Playgroud)
我看了一下git decumentation,发现git branch -a --contains <commit_id>哪个列出了包含a的所有分支commit_id.
$ git branch -a --contains 4af9822
master
remotes/origin/someBranch
...
Run Code Online (Sandbox Code Playgroud)
然后我找到了命令 git tag --contains 9338f2d
$ git tag --contains 9338f2d
someTag
anotherTag
...
Run Code Online (Sandbox Code Playgroud)
我当然可以这样做,
$ git branch -a --contains 4af9822 && git tag --contains 9338f2d
Run Code Online (Sandbox Code Playgroud)
但是有一个命令可以一次打印所有参考吗?
为了增加torek的答案,git 2.7(2015年第4季度)将提供更完整的版本git for-each-ref,现在支持--contains
git for-each-ref --contains <SHA1>
Run Code Online (Sandbox Code Playgroud)
见提交4a71109,提交ee2bd06,提交f266c91,提交9d306b5,提交7c32834,提交35257aa,提交5afcb90,提交d325406,提交6841104,提交b2172fd,提交b2172fd,...,提交b2172fd(2015年7月7日),并提交af83baf( 2015年7月9日)由Karthik Nayak(KarthikNayak).
(由Junio C gitsterHamano合并- -在提交9958dd8,2015年10月5日)
从某些功能"
git tag -l"和"git branch -l"已经提供给"git for-each-ref",最终使统一的实现可以在所有三个共享,在后续两个系列.
* kn/for-each-tag-branch:
for-each-ref: add '--contains' option
ref-filter: implement '--contains' option
parse-options.h: add macros for '--contains' option
parse-option: rename parse_opt_with_commit()
for-each-ref: add '--merged' and '--no-merged' options
ref-filter: implement '--merged' and '--no-merged' options
ref-filter: add parse_opt_merge_filter()
for-each-ref: add '--points-at' option
ref-filter: implement '--points-at' option
Run Code Online (Sandbox Code Playgroud)
请注意,git for-each-ref --no-contains <SHA1>最终支持启动Git 2.13(2017年第2季度)!
见提交7505769,提交783b829,提交ac3f5a3,提交1e0c3b6,提交6a33814,提交c485b24,提交eab98ee,提交bf74804(2017年3月24日),提交7ac04f1,提交682b29f,提交4612edc,提交b643827(2017年3月23日),以及提交17d6c74,提交8881d35,提交b084060,提交0488792(2017年3月21日)由ÆvarArnfjörðBjarmason( )avar.
(由Junio C Hamano合并-gitster-在提交d1d3d46,2017年4月11日)
没有内置[ 编辑,2015年10月:现在,请参阅VonC的新答案 ],但使用git branch -a --contains并且git tag --contains应该为您提供通常会发现"有趣"的所有参考.
有一种(非内置的)方法可以找到所有这些引用.每当你询问"所有引用"时,你应该看一下git for-each-ref.它允许您遍历所有引用或所有引用的子集:
$ git for-each-ref
996b0fdbb4ff63bfd880b3901f054139c95611cf commit refs/heads/master
740c281d21ef5b27f6f1b942a4f2fc20f51e8c7e commit refs/remotes/origin/maint
996b0fdbb4ff63bfd880b3901f054139c95611cf commit refs/remotes/origin/master
7327a17171fc87d5f8f5c790eb1ba1d0e031482d commit refs/remotes/origin/next
[... snip]
efe35e936c6c32a7630086a84b2c3b3471ea534f tag refs/tags/v2.0.1
b4463ead04f1801104502ea087dbb6bdd21b4ef1 tag refs/tags/v2.0.2
3c81e95201ece182e799709c91b15a3501919d26 tag refs/tags/v2.0.3
Run Code Online (Sandbox Code Playgroud)
(在这种情况下,我git for-each-refs在git本身的存储库上运行,没有其他参数,因此它产生默认输出).
您现在要做的就是--contains在原始参考上运行检测器.尽管存在具有此作为动词没有管道命令,--contains很容易表达为在测试git merge-base使用--is-ancestor.正如git branch文档所述,--contains只需测试上面显示的refs/heads/或者refs/remotes/引用左侧的分支尖端SHA-1 是否是指定提交的后代."是一个后代"实际上是与"是一个祖先"相同的测试,参数被交换:
$ git branch --contains 996b0fd^
* master
$ git rev-parse 996b0fd^
6da748a7cebe3911448fabf9426f81c9df9ec54f
Run Code Online (Sandbox Code Playgroud)
因为master是996b0fd...,--contains两者996b0fd及其第一个父母的匹配6da748a...,所以我们可以判断我们的git merge-base --is-ancestor参数是否正确:
$ git merge-base --is-ancestor 6da748a 996b0fd && echo ok
ok
Run Code Online (Sandbox Code Playgroud)
注意,它996b0fd被认为是它自己的祖先:
$ git merge-base --is-ancestor 996b0fd 996b0fd && echo ok
ok
Run Code Online (Sandbox Code Playgroud)
所以你需要做的就是将a git for-each-ref和shell命令或循环串在一起运行git merge-base --is-ancestor.
| 归档时间: |
|
| 查看次数: |
1838 次 |
| 最近记录: |