Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Github Webhooks&;确定分支点。吉特/_Git_Github - Fatal编程技术网

从Github Webhooks&;确定分支点。吉特/

从Github Webhooks&;确定分支点。吉特/,git,github,Git,Github,我正在试图跟踪Github上回购协议创建时的历史记录。使用PushEvent跟踪线性历史足够简单,但我也希望跟踪分支、合并等 到目前为止,它看起来像是一个PushEvent的before字段只提供了被推送的ref上的上一次提交,因此如果创建一个名为test的分支并推送到它,那么上一次提交是000000,因为test上没有上一次提交。CreateEvent只告诉您创建了一个分支,但它似乎没有告诉您分支点是什么 据我所知,解决这个问题的唯一方法是拉取repo并爬网.git/,以重建完整的历史DAG。

我正在试图跟踪Github上回购协议创建时的历史记录。使用
PushEvent
跟踪线性历史足够简单,但我也希望跟踪分支、合并等

到目前为止,它看起来像是一个
PushEvent
before
字段只提供了被推送的
ref
上的上一次提交,因此如果创建一个名为
test
的分支并推送到它,那么上一次提交是
000000
,因为
test
上没有上一次提交。
CreateEvent
只告诉您创建了一个分支,但它似乎没有告诉您分支点是什么

据我所知,解决这个问题的唯一方法是拉取repo并爬网
.git/
,以重建完整的历史DAG。这是正确的,还是我应该调查另一种事件

另外,如果我试图从
.git/
重新创建历史记录,
logs/refs/head/{branch name}
只会提供如下信息:

3e0422…
3e6422…
{Author}
1458238937-0700
merge
test
:通过“递归”策略进行合并

这不会告诉您哪个提交与创建合并提交的
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
    file
    的树和blob,但由于新树和文件与某些现有树和文件相匹配,可能已经存在所需的树和文件blob,尽管这种可能性很小);及
  • refs/heads/b2
    设置为
    b200000…
    的请求
新提交具有常规元数据:提交
b100000…
具有指向其父级的
master
,并且
b200000…
具有
b100000…
作为其父级。让我们假设自克隆之后,
master
没有移动,并调用其commit
a000000…

服务器上可能既不存在
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
等等。)