我正在尝试创建一个夜间进程,该进程将创建一个在前一天的最后一次提交和分支的当前HEAD
之间更改的文件列表。
我一直在看Stash API,可以在这里找到:
https://developer.atlassian.com/static/rest/stash/3.11.3/stash-rest.html
看起来/compare/changes
和/diff
将能够完成任务,但我只能让他们为单次提交更改工作。
有没有办法扩展它,以便我可以在多个提交之间更改所有文件名?
例如:commit1
到 commit10
之间的所有文件?
这个怎么样:
https://stash.domain.com/rest/api/latest/projects/{project}/repos/{repository}/changes?since={commit_1}&until=${commit_10}
我只是简单地看了一眼(他们有一些奇怪的术语,称这些为"变更集"而不是"提交"ID:这对Mercurial有意义,但对Git不重要),但API确实需要两个ID,这就是你所需要的。
例如,在您的示例中,您想查看发生了什么
在提交 1 到提交 10 之间
"between"这个词有点可疑(因为提交首先不一定是线性的,并且因为它引入了栅栏错误),但一般来说,要做到这一点,您只需将(ID)commit1(或其父级,取决于您是在计算栅栏柱还是栅栏杆)与(ID)commit10进行比较。
当使用 Git 执行此操作时,而不是通过一些烦人的 REST API 时,它表示为,例如:
$ git diff --name-status 1fe9ca7 6631bed
它显示了6631bed
中所有变化与1fe9ca7
中任何变化,由于变更集的代数,这是每个变更集"之间"(又是那个滑溜溜的词)两个端点的总和。
Git 不存储这些变更集;它存储每次提交时的实际内容。 因此,变更集是按需生成的(由 git diff
),这就是为什么它们的术语看起来有点奇怪。 你确定两个实际的提交,而不是一个变更集,然后 git 提取一个变更集。
为git diff
命令涉及的两个提交提供SHA
:
git diff --name-only SHA1 SHA2
这篇文章提供了有关使用 ..
和 ...
来获取您可能正在寻找的集合的详细信息(如果您选择这种格式 - 在提交之间使用点进行差异)
注意:
--name-only
:仅显示已更改文件的名称。
我认为以下内容应该有效:
- 假设最后一个提交哈希是:abcdefg
- 分支名称为开发,其头部要与
以下 curl 请求可以为您提供差异:
curl -s -H "Content-Type: application/json" http(s)://rest/api/1.0/projects/project-key/repos/repo-slug/compare/changes?from=refs/heads/develop&to=abcdefg&limit=1000
笔记:
- 添加了"限制"参数,以便可以显示到 1000 条记录。默认页面大小为 25。
"jq"是一个 JSON 解析器实用程序,可以选择用于解析响应。
例如,我将上述 curl 的响应"管道"到以下,以仅获取已更改的文件名:jq '.values|.[]|.路径|。到字符串'