从Github Webhooks&;确定分支点。吉特/
我正在试图跟踪Github上回购协议创建时的历史记录。使用从Github Webhooks&;确定分支点。吉特/,git,github,Git,Github,我正在试图跟踪Github上回购协议创建时的历史记录。使用PushEvent跟踪线性历史足够简单,但我也希望跟踪分支、合并等 到目前为止,它看起来像是一个PushEvent的before字段只提供了被推送的ref上的上一次提交,因此如果创建一个名为test的分支并推送到它,那么上一次提交是000000,因为test上没有上一次提交。CreateEvent只告诉您创建了一个分支,但它似乎没有告诉您分支点是什么 据我所知,解决这个问题的唯一方法是拉取repo并爬网.git/,以重建完整的历史DAG。
PushEvent
跟踪线性历史足够简单,但我也希望跟踪分支、合并等
到目前为止,它看起来像是一个PushEvent
的before
字段只提供了被推送的ref
上的上一次提交,因此如果创建一个名为test
的分支并推送到它,那么上一次提交是000000
,因为test
上没有上一次提交。CreateEvent
只告诉您创建了一个分支,但它似乎没有告诉您分支点是什么
据我所知,解决这个问题的唯一方法是拉取repo并爬网.git/
,以重建完整的历史DAG。这是正确的,还是我应该调查另一种事件
另外,如果我试图从.git/
重新创建历史记录,logs/refs/head/{branch name}
只会提供如下信息:
3e0422…
3e6422…
{Author}
1458238937-0700
mergetest
:通过“递归”策略进行合并
这不会告诉您哪个提交与创建合并提交的3e0bad…
合并。唯一的方法是转到logs/refs/head/test
,查看时间戳1458238937
之前的最新提交,还是在其他地方显式存储父提交
提前谢谢 信息确实不可用 例如,请考虑以下命令序列:
$ git clone <url> repo
$ cd repo
$ git checkout -b b1 master
Switched to a new branch 'b1'
$ echo stuff >> file; git add file; git commit -m add-stuff
[b1 b100000] add-stuff
...
$ git checkout -b b2
Switched to a new branch 'b2'
$ echo more stuff >> file; git add file; git commit -m more-stuff
[b2 b200000] more stuff
...
$ git push origin b2
$git克隆repo
$cd回购
$git结帐-b b1主
切换到新的分支“b1”
$echo stuff>>文件;git添加文件;git提交-m添加内容
[b1 b100000]添加内容
...
$git结帐-b b2
切换到新的分支“b2”
$echo更多内容>>文件;git添加文件;git提交-m更多内容
[b2 b200000]更多内容
...
$git推送源b2
请注意,我没有在这里按b1
此时,origin
(无论是github还是任何其他站点)从我们这里收到:
- 提交
(这个散列当然是由散列组成的;以b100000…
开头的名称意味着告诉我们b1
是使用分支b1
从“主”创建的)李>b1
- 提交
李>b200000…
- 这两次提交所需的任何树和/或文件blob(可能更新了file
的树和blob,但由于新树和文件与某些现有树和文件相匹配,可能已经存在所需的树和文件blob,尽管这种可能性很小);及file
- 将
设置为refs/heads/b2
的请求b200000…
b100000…
具有指向其父级的master
,并且b200000…
具有b100000…
作为其父级。让我们假设自克隆之后,master
没有移动,并调用其commita000000…
服务器上可能既不存在b1
也不存在b2
。因此,服务器的钩子会得到一个更新,该更新创建指向b200000…
,即“old”SHA-1是空散列
如果在服务器上接受此推送,然后查看结果提交图,我们将看到b2
指向b200000…
,它指向b100000…
,它指向a00000…
,它位于现有分支master
上。然后我们将得出结论,分支b2
是直接从master创建的
但事实并非如此
如果我现在git推送origin b1
,我将不发送任何对象(origin
已经有了所需的一切)和将refs/heads/b1
设置为b100000…
的请求。这将是钩子中的另一个分支创建,但这次创建的是指向已在分支b2
上的提交的b1
。我们现在应该在哪里确定b1
是从哪里创建的
另外,如果我试图从[reflog,遇到merge…]重新创建历史记录
合并发生前的当前提交始终是合并提交本身的第一个父级。在图中,提交中的合并由合并的第二个(或在八达通合并的情况下,第三个、第四个等)父项标识。如您所见,reflog中的文本包含提交给
git merge
的参数,该参数可能是分支名称或标记名称,或者实际上是git rev parse
可以接受的任何内容(请参阅)。谢谢,torek!我花了一点时间挖掘git源代码,现在还不完全清楚他们是如何重建历史的。e、 例如,当您键入git log
时,它显示某个合并提交是两个(或更多)提交的合并。这些信息从何而来?亲子关系直接存储在提交对象本身中。使用git cat file-p
查看对象(这会将树对象转换为文本格式,而其余对象只需解压缩)。提交有一系列内部元数据的标题行,然后是空行,然后是日志消息。提交的内部数据包括其父ID。(通常,最好运行git“管道”命令来提取此类数据,例如,git rev parse
来获取ID,git ls tree
等等。)