是否有比做库得到SHA1s的原始列表中的所有对象的一种更好的方式ls .git/objects/??/\*和cat .git/objects/pack/*.idx | git show-index?
我知道,git rev-list --all但只列出.git/refs引用的提交对象,我正在寻找包括由git-hash-object,git-mktree等创建的未引用对象的所有内容.
该--abbrev-commit标志可以与git log和一起使用,git rev-list以显示部分前缀,而不是提交对象的完整40个字符的SHA-1哈希值.根据Pro Git的书,
它默认使用七个字符,但如果有必要使它们更长,以保持SHA-1明确[...]
另外,短SHA的长度至少为4个字符.仍然根据Pro Git的书,
通常,八到十个字符足以在项目中独一无二.
例如,Linux内核是一个相当大的项目,具有超过450k的提交和360万个对象,没有两个对象的SHA-1重叠超过前11个字符.
由于防止提交对象的所有前缀哈希值之间的任何重叠所需的最长前缀的长度(11,在Linux内核的情况下)是回购邮件大小的粗略指示,我想以编程方式确定相应的数量.我自己的本地存储库.我怎样才能做到这一点?
一般问题:给定一组提交,我如何找到所有提交的提交列表作为祖先,或相关地,包含所有这些提交的第一个提交.
我可以通过查找git branch --contains <commit>集合中所有提交返回的分支来查找包含提交的分支(类似标记),但是git rev-list没有--contains选项.实际上,我正在寻找一种方法来组合常规--contains参数git rev-list,并将输出限制为包含所有列出的提交的提交,而不是其中任何一个(这是如何--contains正常工作).
具体的例子:鉴于提交a,b,c,我怎么能找到的第一个承诺是在其祖先的所有三个提交?
例如,给定下面的树,我如何找到标记为X的提交?
* (master)
|
X
|\
a *
| |
b c
|/
*
|
*
Run Code Online (Sandbox Code Playgroud)
我假设我可以做一些魔法git rev-list,并且可能涉及到<commit1>...<commit2>符号,但我不能比这更进一步.
如何查找具有给定提交作为父级的所有提交?
例如,如果我有这个Git提交图,
G H I J
\ / \ /
D E F
\ | / \
\ | / |
\|/ |
B C
\ /
\ /
A
Run Code Online (Sandbox Code Playgroud)
我想获得的所有的直系后裔的名单B:D,E和F.
给定两个(或更多)提交,我想找到连接它们的最旧的合并。git merge-base与(找到最年轻的共同祖先)相反。请注意,查找的提交 I\xe2\x80\x99m 将是起始提交的较年轻的后代。
换句话说:我想调查合并两个给定提交的合并提交(其中发生了对同一文件的更改)。
\n我正在使用标签来识别发布版本并识别任务的"开发完成"提交.做一个git tag我得到如下列表.
> git tag
v0.1.0
task_1768
task_2011
task_1790
task_1341
v0.1.1
task_2043
task_2311
v0.1.2
Run Code Online (Sandbox Code Playgroud)
假设所有标签都指向master分支上的提交,有没有办法列出所有标签,因为有些标签?例如,要生成v0.1.2发布中包含的所有任务的列表- 我正在寻找类似下面的内容(这不是实际的命令).
> git tag -l "task_*" --since v0.1.1
Run Code Online (Sandbox Code Playgroud)
获得如下输出.
task_2043
task_2311
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点git tag?
有没有办法做到这一点git rev-list?
(或者其他一些git命令?)
根据答案和评论,以下是我目前正在使用的内容.
> git log v0.1.1.. --decorate | grep -Eow 'tag: ([a-zA-Z0-9.-_]*)' | awk '{ print substr($0, 6); }'
task_2043
task_2311
v0.1.2
> git log v0.1.1.. --decorate | grep -Eow 'tag: ([a-zA-Z0-9.-_]*)' | awk '{ print substr($0, 6); }' …Run Code Online (Sandbox Code Playgroud) git-rev-list如何命令它返回的提交?
我主要是指在开发的并发分支上进入的提交,然后合并到主分支.似乎没有按照日期对提交进行排序,这是有道理的,因为提交可以在过去或将来的不同时间挑选.
例如,这里有一些历史git-log......
* Sat, 25 Aug 2012 11:37:23 -0700 8238401
|\
| * Thu, 23 Aug 2012 12:29:09 -0700 c9de861
* | Fri, 24 Aug 2012 16:29:01 -0700 b7e8827
|\ \
| * | Mon, 14 May 2012 20:46:30 +0200 0a1db74
| * | Mon, 14 May 2012 17:54:25 +0200 e03e71d
| * | Fri, 13 Jul 2012 12:01:11 +0200 bffa852
* | | Fri, 24 Aug 2012 15:45:13 -0700 09fad50
|\ \ \
| * | …Run Code Online (Sandbox Code Playgroud) 我有一个提交哈希列表,我需要按时间顺序排序。
我以为可以git rev-list做到这一点,但是即使我在命令行上指定了提交,它仍然坚持向我显示所有提交。
有没有办法让git做到这一点,还是我必须结合git rev-list和grep?
谢谢!
可以使用git rev-list命令获取后面/前面的提交数量。我正在尝试使用libgit2sharp库来实现同样的事情,但是该库没有完整记录,所以我找不到如何实现。
我正在寻找一个使用 获取后面/前面提交号的示例libgit2sharp。
在寻找 git hook 示例时,我遇到了以下帖子:https : //github.com/Movidone/git-hooks/blob/master/pre-receive,我想了解以下命令:
git rev-list $new_list --not --all
Run Code Online (Sandbox Code Playgroud)
从哪里获得 new_list:
NULL_SHA1="0000000000000000000000000000000000000000" # 40 0's
new_list=
any_deleted=false
while read oldsha newsha refname; do
case $oldsha,$newsha in
*,$NULL_SHA1) # it's a delete
any_deleted=true;;
$NULL_SHA1,*) # it's a create
new_list="$new_list $newsha";;
*,*) # it's an update
new_list="$new_list $newsha";;
esac
done
Run Code Online (Sandbox Code Playgroud)
我认为 rev-list 以相反的时间顺序显示提交。
但是,有人可以分享更多关于什么-not和-all选项的含义的见解吗?
根据文档:
--not
Reverses the meaning of the ^ prefix (or lack thereof) for all following revision specifiers, up to the …Run Code Online (Sandbox Code Playgroud) 我想知道与 100 submit in branch 相关的 commit-id dev。(例如:)git rev-list --reverse --branches=dev --date-order --count <commit-id> == 100:
得到 100 次提交是1f345e80fba518c72dec7f2e02da5da12be5810f:
$ git rev-list --reverse --branches=dev --date-order HEAD | head -100 | tail -1
1f345e80fba518c72dec7f2e02da5da12be5810f
$ git rev-list --reverse --branches=dev --date-order HEAD | nl | grep 100
100 1f345e80fba518c72dec7f2e02da5da12be5810f
$ git rev-list --reverse --branches=dev --date-order HEAD | awk '{print NR"\t"$0}' | grep -E ^100
100 1f345e80fba518c72dec7f2e02da5da12be5810f
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试验证有关此 commit-id ( 1f345e80fba518c72dec7f2e02da5da12be5810f)的 rev-number 时,结果显示:rev number is 98 !!! …
git ×11
git-rev-list ×11
git-log ×2
git-branch ×1
git-merge ×1
git-show ×1
git-tag ×1
libgit2 ×1
libgit2sharp ×1
linux-kernel ×1
sha1 ×1