Git 如何列出当前正在验证的拉取请求中更改的所有文件(在VSTS中)?
我有一个PR验证版本,我想列出PR中更改的所有文件以及状态 在每个构建上同步源。 因此,在合并PR更改之前,源代码位于修订版Git 如何列出当前正在验证的拉取请求中更改的所有文件(在VSTS中)?,git,Git,我有一个PR验证版本,我想列出PR中更改的所有文件以及状态 在每个构建上同步源。 因此,在合并PR更改之前,源代码位于修订版A(通常为origin/master)。 让我将PR merge commit指定为B 我当前的实现调用了git diff tree--name status-r-ma..B,但正如所示,这是不正确的 那么,正确的方法是什么?注意,Pull请求可能包含多个提交,其中至少有一个合并提交-B。但可能会有更多的合并提交 我非常确定有一种纯Git的方法可以做到这一点,并且不需要对T
A
(通常为origin/master
)。
让我将PR merge commit指定为B
我当前的实现调用了git diff tree--name status-r-ma..B,但正如所示,这是不正确的
那么,正确的方法是什么?注意,Pull请求可能包含多个提交,其中至少有一个合并提交-B
。但可能会有更多的合并提交
我非常确定有一种纯Git的方法可以做到这一点,并且不需要对TFS服务器执行RESTfulAPI来检查Pull请求对象
编辑1
让A=b00bf1df0
和B=81317ea59
给定(我正在使用Powershell):
实际上,所讨论的PR有一个提交-b7d9617fc
,其中81317ea59
是PR合并提交(即它是B
)
正如我的另一篇文章所示,git diff tree--name status-r-M b00bf1df0..81317ea59
不正确
我认为使用
..
也不正确,事实上:git diff tree--名称状态-r-M b00bf1df0…81317ea59
不会返回任何结果。我认为你应该使用..
而不是。
根本问题是问题的形式不正确:
。。。列出PR中更改的所有文件以及状态
拉取请求实际上是一种如下形式的请求:请更改分支名称B
,这样,在您着手更改时,它不会指向提交所指向的任何内容,而是指向提交C
。您可以随意执行此操作,但也可以通过自己的合并提交。拉请求这件事可能是也可能不是很难说,因为拉请求不是Git本身的一部分,而是由各种web服务提供的附加组件,每个web服务都可以实现这一点,尽管它们喜欢包含表单信息:顺便说一下,当我要求您将nameB
的值更改为hash IDC
时,的值为hash IDO
现在让我们假设它提供了所有三项:分支名称B
,旧的提交哈希IDO
,以及请求的提交哈希IDC
。我们还要声明B
的实际哈希值当前是A
。可能是A=O
,也可能不是。(如果拉取请求中不包括O
,这并不是真正致命的,但这将取决于您找到合适的替代品,并定义其工作方式等等。)
关于提交需要知道什么
现在,关于提交散列ID的第一件事是它指定一个特定的提交,每个提交都是所有文件的完整快照。这根本不是一系列的变化!这只是一种状态,就像宣布今天外面的温度是68华氏度(20摄氏度)。这本身并不能告诉你昨天或上周发生了什么。若要将状态转换为更改,必须选择其他状态进行比较。如果昨天是77˚F(25˚C),那么变化是9˚F(5˚C)
我们对Git中的提交做同样的事情:我们选择一种状态,比如C
——并将其与以前的某个状态进行比较。但是我们刚才说实际的前一个状态是A
,而记录的前一个状态是O
。如果你比较C
和O
,你会得到与比较C
和a
不同的答案,当然除非a
=O
但这不是承诺的唯一内容。每次提交还记录零个或多个父提交哈希ID,通常正好是1,其次最常见的是合并提交的2个。(零父项表示提交是根提交;通常每个存储库只有一个,用于第一次提交。三个或三个以上是八达通合并。)C
的父项是各自的提交,也有父项,依此类推。考虑到父母,我们真正拥有的可能是这样的:
...--D--E--F--O--A <-- B
\ \
G--H--C <-- (pull requested at C)
...--D--E--F--A <-- B
\
G--C <-- (pull requested at C)
(请求总计为请“倒带”B,以便提交A
和O
消失)
如果需要另一个合并怎么办?
让我们再看看这个图表:
...--D--E--F--O--A <-- B
\ \
G--H--C <-- (pull requested at C)
但是GitHub还提供了另外两种方式来接受这个请求,每种方式都有不同的功能。如果提交G
、H
和C
不在您的存储库中,则rebase和merge选项会生成以下图形:
...--D--E--F--O--A--G'-H' <-- B
因此,B
的当前值与发出拉取请求的人发出拉取请求时的B
的旧值相同。也就是说,我们有A
=O
。如果使用GitHub上的默认“合并”按钮,您将得到以下结果:
...--D--E--F--A------M <-- B
\ /
G--C
...--D--E--F--A--G'-C' <-- B
...--D--E--F--A--S <-- B
如果G'
和C'
提交是拉取请求者的G
和C
提交的副本:快照匹配,甚至G'
的父提交ID也匹配G
;不同的是散列ID:GitHub已经复制了G
和C
,尽管这样的复制没有意义。(例如,我希望GitHub根本没有制作这些副本。其他服务可能没有制作。)原始提交没有进入;相反,复印件要放进去
如果使用“挤压和合并”按钮,将得到以下结果:
...--D--E--F--A------M <-- B
\ /
G--C
...--D--E--F--A--G'-C' <-- B
...--D--E--F--A--S <-- B
现在,您有一个名为pr123
的分支,其提示提交为提交C
,以及指向提交a
的远程跟踪名称origin/B
现在很容易判断A...--D--E--F--A--G'-C' <-- B
...--D--E--F--A--S <-- B
git fetch origin # update everything so that we have origin/B pointing to A, etc
git fetch origin refs/pull/123/head:refs/heads/pr123
if git merge-base --is-ancestor refs/remotes/origin/B refs/heads/pr123; then
echo "it's the simple case, yay"
else
echo "it's the merge case, boo"
fi
git diff-tree -r --name-status [options] refs/remotes/origin/B refs/heads/pr123