如何列出当前正在验证的拉取请求中更改的所有文件(在 VSTS 中)?

2024-05-07

我有一个 PR 验证版本,我想列出 PR 中更改的所有文件以及状态。

源在每个构建上同步。 因此,在合并 PR 更改之前,源位于修订版A(通常origin/master)。 让我将 PR 合并提交指定为B.

我当前的实现调用git diff-tree --name-status -r -M A..B,但作为为什么一系列提交的文件列表与同一范围内每次提交的文件列表的聚合不同? https://stackoverflow.com/questions/53512519/why-is-the-list-of-files-for-a-range-of-commits-different-from-the-aggregation-o表明这是不正确的。

那么,正确的做法是什么呢?请注意,拉取请求可能包含多个提交,其中至少有一个合并提交 -B。但那里可能会有更多的合并提交。

我非常确定有一种纯 Git 方法可以做到这一点,并且无需针对 TFS 服务器执行 Restful API 来检查 Pull Request 对象。

EDIT 1

Let A = b00bf1df0 and B = 81317ea59.

鉴于(我正在使用 Powershell):

C:\Dayforce\tip [master ≡]> git log --format="%h" b00bf1df0..81317ea59
81317ea59
b7d9617fc
C:\Dayforce\tip [master ≡]>

事实上,相关 PR 有一项承诺 -b7d9617fc with 81317ea59是 PR 合并提交(即它是B)

正如我的另一篇文章所示,git diff-tree --name-status -r -M b00bf1df0..81317ea59是不正确的。

我相信使用...确实也是不正确的:git diff-tree --name-status -r -M b00bf1df0...81317ea59什么也不返回。


根本问题是这个问题的格式不正确:

...列出 PR 中更改的所有文件以及状态

实际上,拉取请求是以下形式的请求:请更改分行名称B这样,当您开始更改它时,它就不会指向它所指向的任何提交,而是指向 commitC反而。你可以随心所欲地这样做,但也许可以通过your own合并提交。这个拉取请求可能会也可能不会——很难说,因为拉取请求不是 Git 本身的一部分,而是各种 Web 服务提供的附加组件,并且每个 Web 服务都可以实现这一点they类似——包括以下形式的信息:顺便说一句,当我要求你更改 name 的值时B哈希 IDC, 价值was哈希IDO.

我们暂时假设它提供了所有三项: 分支名称B,旧的提交哈希 IDO,以及请求的提交哈希 IDC。我们还要声明一下B当前的实际哈希值是A。或许A = O,也许不是。 (如果O不包含在拉取请求中,这并不是真正致命的,但是您需要找到合适的替代品,并定义它的工作方式等等。)

关于提交需要了解什么

现在,关于提交哈希 ID 的第一件事是它指定一项特定的提交,并且每次提交都是一个所有文件的完整快照。这根本不是一组变化!这只是一种状态,就像宣布今天外面的温度是 68°F (20°C) 一样。就其本身而言,这并不能告诉你昨天或上周发生了什么。要转动一个state into a change,您必须选择其他一些状态来与之比较。如果昨天温度为 77°F (25°C),change温度为 9°F (5°C)。

我们对 Git 中的提交做同样的事情:我们选择一种状态,例如C——并将其与之前的状态进行比较。但我们刚刚说过actual之前的状态是A,而recorded之前的状态是O。如果你比较C vs O,你会得到与比较不同的答案C vs A,当然除非A = O.

但这并不是提交的唯一内容。每次提交还记录零个或多个parent提交哈希 ID — 通常正好为 1,对于合并提交,下一个最常见的是 2。 (零父母意味着提交是root犯罪;通常每个存储库只有一个,用于第一次提交。三个或以上是一个章鱼合并.) 的父母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)

where A and O是相同的提交。或者它甚至可能是删除某些提交的请求,尽管某些 Web 服务不允许这样做,或者如果您使用它们的“接受请求”接口,则不会采取任何操作,但让我们画出来:

...--C--O--A   <-- B

(请求金额为请“倒带”B 以便提交A and O vanish).

如果需要再次合并怎么办?

让我们再看一下这张图:

...--D--E--F--O--A   <-- B
         \     \
          G--H--C   <-- (pull requested at C)

On GitHub, at least, if you use the default kind of "merge pull request", what GitHub will do is add a new commit—let's call it M—whose snapshot is formed by running a new git merge (on GitHub),1 even though C itself is a merge commit. The snapshot in M will be that produced by combining changes. The end product will be:

...--D--E--F--O--A--M   <-- B
         \     \ __/
          G--H--C

但 GitHub 还提供了两种其他方式来接受此拉取请求,每种方式的作用都不同。如果提交G, H, and C尚未进入your存储库,变基和合并选项会生成以下图表:

...--D--E--F--O--A--G'-H'   <-- B

挤压并合并选项产生:

...--D--E--F--O--A--S   <-- B

where Scontents that M如果 GitHub 做了的话,就会有M.


1The way GitHub makes a merge is not by using git merge, at least not literally, as there is no way to handle conflicts. GitHub won't even offer to make M if there would be merge conflicts. But the effect is as if GitHub ran a literal git merge, so you can use this as a mental model, at least.


最简单的情况:A=O,快进的潜力

假设该图确实如下所示:

...--D--E--F--A   <-- B
               \
                G--C   <-- (pull requested at C)

所以这样current的价值Bold的价值B当时提出拉取请求的人已经成功了。也就是说,我们有A = O。如果您使用 GitHub 上默认的“合并”按钮,您将得到以下结果:

...--D--E--F--A------M   <-- B
               \    /
                G--C

but the contents提交的M将匹配contents提交的C确切地说,这在几个方面都有帮助。

如果您使用变基和合并合并按钮的模式,你会得到:

...--D--E--F--A--G'-C'   <-- B

哪里的G' and C'提交是copies拉取请求者的G and C提交:快照匹配,甚至父提交 IDG'匹配的是G;不同之处在于哈希 ID:GitHub 已复制了两者G and C即使制作这样的副本没有意义。 (我个人希望 GitHub 根本不制作这些副本。其他服务也可能不制作这些副本。)原始提交不会进入;相反,副本会被放入。

如果您使用挤压并合并按钮,你会得到这个:

...--D--E--F--A--S   <-- B

哪里的parent of S is A,而content of S匹配的是C确切地。再次承诺G and C本身不进入存储库:仅C的内容进入(作为“squash”提交中的新快照S).

定义你想要什么

现在您知道拉取请求实际上是一个请求move分支名称,来自现在的位置(A)到从他们请求的提交中派生的东西(C),也许通过添加新的合并提交M,也许通过添加新的挤压合并(普通单父非合并提交)S,或者也许通过复制他们的部分或全部提交。

如果您接受他们的拉取请求,实际会发生什么,取决于您在 GitHub 上单击的按钮,或者您是否使用其他东西(Bitbucket?GitLab?无论它是什么),无论该系统提供什么。由你来决定会发生什么actually happen.

然后,知道实际会发生什么,就需要您再次弄清楚如何比较那些提交will进入您的存储库 - 可能实际上尚不存在的提交! - 已经存在的提交are在你的存储库中。您想比较内容吗C给那些A?你想比较一下吗C的内容O,假设哈希 ID 为O有空吗?或者你想仔细看看什么each与它的父提交相比,新提交会做什么,即使这些提交实际上都不存在?

显然,最后一个是最难的:但是这些新提交的生成遵循一个明确定义的过程,因此要找出它们将包含什么,一旦它们确实存在,您可以简单地在您自己的存储库中自己创建它们如果您接受拉取请求,您的网络服务明天将按照同样的方式创建它们。这里需要注意的是,如果你do这样做——如果你预测他们明天会做什么——然后同意你明天会点击按钮,如果明天分支会发生什么B指向除A?

如果您选择最后一个选项,则基于什么接受would发生这种情况时,您将需要围绕整个操作构建某种流程,以确保发生什么would发生的事情与发生的事情一样does发生。实现这一目标的方法有很多,但没有一种是完美的。

实现你想要的

一旦你有defined你想要什么,你仍然必须achieve它。这对于 GitHub 来说相对简单。 (我不确定您会为 Bitbucket 或其他系统做什么。)您将首先使用git fetch在您自己的存储库克隆中获取提交的副本C任何父母都会承诺你所缺乏的。

我们假设origin是 GitHub 存储库的名称,拉取请求是 #123。然后:

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

您现在有一个名为pr123谁的提示提交是提交C,以及您的远程跟踪名称origin/B指向提交A.

现在很容易判断是否A是的祖先C,即最简单的情况是否有效。这个特定的测试是在 bash 中以这种方式完成的(不确定 PowerShell):

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

In the simple case, regardless of which method you use to accept the pull request, the contents of final commit to which origin/B points in the end will match the contents of commit C, as pointed-to right now by refs/heads/pr123.2 If you've decided that the change you want to test is the overall summary change—that is, from A to C, without looking at any intermediate commits—then the files that will be modified are those listed by:

git diff-tree -r --name-status [options] refs/remotes/origin/B refs/heads/pr123

但如果您还想检查中间提交,则需要做更多工作。

如果你在一个merge在这种情况下,事情会变得更加复杂,因为即使您只是将最终结果与单个提交进行比较,您现在也必须决定是否与提交进行比较A, O,或者完全是其他东西,例如实际的当前合并基础A and C,无论提交是什么。

If you do想要使用实际的合并基础,这就是三点语法有用的地方。然而,由于旧版本的 Git 中存在小错误,我建议运行git merge-base --all refs/heads/B refs/heads/pr123在这里并收集其输出。这将列出一些哈希 ID,最好只有一个:如果您只得到一个,那就是合并基础提交。如果你得到不止一个,他们是all候选合并碱基,以及默认值git merge -s recursive策略将首先合并所有合并基础,然后使用生成的提交作为合并的合并基础。

(通常最明智的做法,或者至少是最简单的做法,就是拒绝复杂的拉取请求,告诉作者这些请求they必须重新设计他们的拉取请求,这样它就不需要任何特殊/奇特的合并。)


2Typically, if you have remote-tracking name origin/B and branch-name pr123 pointing to the desired commits, you can just use those names. However, the method that Git uses to turn a name into a hash ID is a six-step process, outlined in the gitrevisions documentation https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html, and "use as branch name" is way down at step four, after "use as tag name"; "use as remote-tracking" name is step five. What this means in practice is that if you have both branch pr123 and tag pr123, the name pr123 refers to the tag, rather than the branch. For scripts, which will run with no human monitoring warning messages, it's wise to spell out the full names: refs/remotes/origin/B and refs/heads/pr123. You can even resolve them once, to hash IDs, and then use the hash IDs everywhere, since the hash IDs never change.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何列出当前正在验证的拉取请求中更改的所有文件(在 VSTS 中)? 的相关文章

  • 如何修复树与树之间的 Git 错误断开链接?

    我的事务被中断 当我再次尝试时 我遇到了空或损坏的对象错误 在另一个问题之后 我删除了所有空文件 当我运行时 git fsck full 我收到这个错误 Checking object directories 100 256 256 don
  • DVCS命令的统一

    当处理多个 开源 项目时 多个版本控制系统开始出现问题 虽然它们共享共同的操作 但我经常在输入时犯错误hg add反而git add 我记得前段时间看到过一个项目 通过提供基本命令以统一的方式访问不同的源代码控制软件提交 ci add等在外
  • 相当于“svn update -r”的 git 是什么?

    我是最近的 git 转换者 能够使用 git svn 将我的分支保留在本地而不干扰 svn 服务器真是太棒了 最新版本的代码中存在一个错误 我想确定一个它起作用的时间 以便我可以使用 git bisect 我找不到正确的命令来及时返回 谢谢
  • 运行“git apply”时出错

    当我尝试时 您能否告诉我如何解决 补丁不适用 错误 git 应用补丁 git apply 0001 my patch error patch failed test xml 114 error text xml patch does not
  • SSH 到 Openshift 服务器失败

    我正在 openshift 服务器上使用 jboss catridge 我希望与其他人共享此实例并添加其他用户的公钥 id rsa pub 当其他人尝试访问该实例时 他会收到以下错误 我在他的实例中尝试了同样的方法 但看到了同样的错误 与
  • 如何使用交互式变基将提交编辑为未提交?

    我想使用交互式变基来编辑以前的提交 但是当我进入该提交的编辑模式时 所有文件都已提交 我知道我可以进行更改并修改提交 但我希望所有更改最初都未提交 暂存或以其他方式 这样我就可以对其进行编辑 就像在最初提交之前一样 这可能吗 Imagine
  • 远程测试时如何搭建git开发环境

    这似乎是一个愚蠢的问题 但我觉得我对 GIT 相当了解 但我似乎无法按照我的意愿设置我的开发环境 我要么错过了一些非常简单的东西 要么我做错了 我在我的服务器上初始化了一个裸 git 存储库 将其克隆到我的本地计算机 提交我的文件并推送到原
  • 在 github 上的 fork 中跟踪上游的最佳实践

    摘要 对于要维护一组本地更改的上游存储库 处理长期运行跟踪的最佳实践是什么 我想让 github 上的 fork 与上游保持同步 但仍然允许清晰跟踪 fork 特有的更改 对于本次讨论 假设upstream指向主项目存储库并且origin指
  • 自动将所有 GitHub 存储库镜像到 gitlab

    对于 GitLab 必须手动为每个存储库设置拉 推镜像 我想知道那里有any way可以自动将所有 Github 存储库同步到 GitLab 这样 当您在 GitHub 中创建新的存储库时 GitLab 中的存储库将自动创建 并充当拉取镜像
  • 丢失了我在 GIT 中的提交。你会不小心删除提交吗?

    我正在使用 git gui 但看不到我的分支 我知道我今天检查了一些东西 在完成提交并使用分支查看器验证后 我更改为较早的分支 我对之前的分支进行了更改 然后想返回到当前的分支 但我再也看不到它了 任何帮助都会很棒 回答你的问题 在大多数情
  • Composer 用于下载私有 GitHub 存储库

    我无法使用 Composer 下载 github 私人存储库 php composer phar update 我收到以下错误 The https api github com repos company private1 https ap
  • git 别名中的 AWK 语句

    我正在尝试创建一个 git 别名来以特定格式打印日志中的所有拉取请求 但是 我在使用 AWK 删除双空格时遇到问题 这是使用以下命令的 git log 的输出 git log merges grep pull request pretty
  • Git - 创建拉取请求而不分叉

    使用 git 已经有一段时间了 关于 git pull request 有很多教程和解释 其动机是什么等等 我遇到两种情况 1 分叉 git 仓库 我查看了一些公共 git 存储库并决定我想要做出贡献 所以我 通过以下方式创建重复的存储库F
  • 无法从 Sourcetree 拉取 Git 远程存储库

    我生成了 ssh 密钥并配置了我的 git 和 SourceTree 我可以 git pull 并从 Git bash 执行其他操作 注意 我在 bashrc 中添加了以下内容以使其正常工作 eval ssh agent ssh add 然
  • Netbeans 和 Git,.obj 文件被忽略

    我正在开发一个涉及 obj 文件的小型 git 项目 当我查看 项目选项卡 时 我发现它们被忽略了 但如果我查看我的 gitignore 我无法理解为什么 DepthPeeling nbproject private DepthPeelin
  • apt-get 无法在 ubuntu dockerfile 中工作

    我对 docker 相当陌生 正在尝试通过编写自己的镜像来学习 并且目前正在阅读 Docker 的实际操作 ISBN 1633430235 在我自己的代码和书中的示例 第 146 页 中 我想通过 dockerfile 安装 git My
  • git 日志历史记录图,每次提交一行,彩色,带有日期

    我需要的格式如下 git log decorate graph oneline date order 但我也需要它 包含日期 短 具有相同的颜色 I tried git log decorate graph oneline date ord
  • 将bitbucket发布到数字海洋

    我本质上是试图使用 bitbucket 来理解 git 的概念 我一直在通过修改本地帐户和 bitbucket 帐户之间的文件来练习版本控制 事实证明这很有帮助 现在我正在尝试弄清楚如何将文件从 bitbucket 或者我猜是 GitHub
  • Android 存储库初始化失败

    我想我非常仔细地遵循该网站的说明 http source android com source downloading html http source android com source downloading html 但是当我尝试这
  • git 排除与忽略

    I use Tower http www git tower com 用于在 Mac 中使用 Git Tower 中的设置具有创建 gitignore 的 忽略 部分 但它还有另一个名为 排除 的部分 似乎可以将排除与 git ls fil

随机推荐

  • 创建以克为单位销售的 Woocommerce 产品

    我想在 WooCommerce 中创建一种以克为单位销售的产品 客户可以在产品页面上输入他们想要的克数 在输入字段中 价格将即时计算并添加到购物车中 我的问题是 这是否可能 如果可以 有人可以给我一个关于如何实施它的 大局 想法吗 我不需要
  • 有没有办法指定 .net 将使用哪个 NetworkInterface?

    我想使用 Wifi 和 LAN 连接在设备上运行一系列测试 我有两张网卡 一张是WiFi 一张是有线 该设备具有可通过两个网络接口访问的单个 IP 地址 有没有办法保证我的机器使用特定的网络接口 以便我可以通过有线连接运行所有测试 然后通过
  • Android - 为服务实现startForeground?

    所以我不确定在哪里 如何实现此方法以使我的服务在前台运行 目前我在另一项活动中通过以下方式开始我的服务 Intent i new Intent context myService class context startService i 然
  • 使用 Javascript 下载 BIM360 Docs 文件

    我正在尝试使用 javascript 下载 BIM360 文档文件 我能够从 BIM360 获取文件响应 但无法保存具有正确内容的文件 这是我的 JS 代码 document ready function var anchor vcard
  • 什么是 Tree Shaking?为什么需要它?

    我已经开始学习 Angular 2 并且遇到了 tree shake 这个术语 但我无法从初学者的角度找到任何好的解释 我在这里有两个问题 什么是 Tree Shaking 为什么需要它 我该如何使用它 我看到你在这里有三个问题 1 什么是
  • WebSockets 监听 UNIX 域套接字?

    是否可以在 nginx 服务器后面设置一个 WebSockets 服务器来处理 UNIX 域套接字上的连接 我目前在同一台计算机上有多个 WebSocket 服务器实例 并且存在端口共享问题 所有实例都必须分配一个唯一的端口 我想避免这种情
  • 模块版本不匹配。预计49,实际48

    我正在使用 Electron 模块 mdns 并且收到此错误 A JavaScript error occurred in the main process Uncaught Exception Error Module version m
  • 阻止 Android 应用程序启动

    我读过很多关于是否可以阻止 Android 应用程序启动的问题 但所有答案似乎都是 不 你不能 这个想法非常简单 我们希望用户能够使用预装在其移动设备上的一组受限制的应用程序 如果用户尝试启动未经授权的应用程序 系统将提示他输入 PIN 码
  • 使用 cmd.exe 更改目录并在该目录中运行命令

    我想做的就是 更改到不同驱动器的特定目录 在该目录中运行命令 例如目录 我需要使用从不同驱动器开始的 cmd exe 在一行中执行此操作 我会这样做 c cd temp dir 所以到目前为止我在一份声明中 cmd c c cd temp
  • 角度守卫,文档中的声明不明确

    我想深入了解角度 所以我读了the docs http angular io这非常有帮助 现在我正在研究守卫 我在文档中读到了这个声明 路由器首先从最深的子路由到顶部检查 CanDeactivate 和 CanActivateChild 防
  • 在读取之前设置未定义的 javascript 属性

    var tr tr SomeThing SomeThingElse console log tr SomeThing SomeThingElse console log tr Other undefined tr get function
  • 同一张表上的多对多

    有趣的是我从来没有遇到过这个 我从来没有想过一个人可以在一张桌子上建立 多对多 关系 直到我开始开发一种用户可以互相 加好友 的系统 社交网络 标准查找表 至少以我习惯使用的方式 在这里不合适 让我们保持简单 用户表有 id 和 name
  • android-button 背景可绘制不起作用

    这是我的 xml 可绘制代码 名称为 bts theme xml
  • Android:如何在触摸事件中手动实现长按?

    简短版本 我想要一种方法来在 onTouchEvent 上启动基于时间的计数器 并测试在响应之前是否已经过了一定的时间 作为手动 LongTouch 检测 解释 我有一个自定义 imageView 可以通过两根手指滑动滑入 滑出屏幕 我想向
  • Angular 2 测试 - 获取 DOM 元素样式

    我想在 Angular 2 应用程序中测试隐藏显示按钮的功能 测试是用 Jasmine 编写的 所以我需要检查display相关元素的属性 我怎样才能使用 Angular 获得这个属性debugElement 测试代码 let input
  • 我不应该在 Spring Boot 项目中使用“new”关键字吗?

    我正在研究 Spring Boot Rest API 最后我确实使用了new关键字在这里和那里 我想知道 当我在程序中使用 new 关键字时 我是否做错了什么 而如果在实际项目中绝对禁止使用new关键字 如果答案是肯定的 我应该注释我编写的
  • C# 中多个类的别名

    我想 正在努力 使我的代码更具可读性 我一直在使用以下类别名 using Histogram EmpiricScore
  • 加载包时 R 会话中止

    我的 RStudio 0 99 879 R 3 2 3 OSX 10 11 3 崩溃R Session Aborted每次运行都会出现错误提示require ggvis v0 4 2 我已经重新安装了 R RStudio 和 ggvis 没
  • 多个 Rails 应用程序,单个 MySQL 数据库

    我打算为 site com api site com admin site com 分别创建多个 Rails 应用程序 所有应用程序都将从一个 MySQL 数据库访问相同的表 应用程序和数据库在同一服务器上运行 对于上述访问场景 Rails
  • 如何列出当前正在验证的拉取请求中更改的所有文件(在 VSTS 中)?

    我有一个 PR 验证版本 我想列出 PR 中更改的所有文件以及状态 源在每个构建上同步 因此 在合并 PR 更改之前 源位于修订版A 通常origin master 让我将 PR 合并提交指定为B 我当前的实现调用git diff tree