有没有办法(从命令行)列出 Git/GitHub 中 PR 中更改的所有文件的名称?这将用于查找需要在该 PR 的 Travis CI 构建中运行哪些测试。
CI 构建在调用我们的脚本之前运行这些命令:
git clone --depth=50 git://github.com/jekyll/jekyll.git jekyll/jekyll
cd jekyll/jekyll
git fetch origin +refs/pull/2615/merge
git checkout -qf FETCH_HEAD
一般来说,您可以使用
git diff --name-only
列出任意两次提交之间更改的文件:
这里的问题似乎是确定“合并基础”。如果所有分支都源自 master,那么你可以这样做:
git --no-pager diff --name-only FETCH_HEAD $(git merge-base FETCH_HEAD master)
这将向您显示
FETCH_HEAD
从 master
分支到当前 FETCH_HEAD
的点之间的变化。我在本地测试了这个,PR分支被从master
中删除,我相信它应该可以工作。
使用 GitHub cli (gh) 你可以运行:
gh pr view 2615 --json files --jq '.files.[].path'
我做了一个
gh alias
,因为我经常使用它:
gh alias set pr_files "pr view $1 --json files --jq '.files.[].path'"
然后我用
gh pr_files 2615
或 gh pr_files 2615 | cat
来称呼它
gh pr_files 2615 | cat
特别对于 GitHub,这可以使用 REST API 来完成:
GET /repos/:owner/:repo/pulls/:pull_number/files
您可以使用 GitHub 库 之一来实现此目的。
Chrome 控制台...
注意:如果 Github 更改页面中的标签/类/ID,这将会中断。
const fileElems = document.querySelectorAll('#files div.js-diff-progressive-container div.file div.file-header div.file-info a.Link--primary');
const filePaths = [];
for (let a of fileElems) {
filePaths.push(a.title);
}
const filePathsStr = filePaths.join('\n');
console.log(filePathsStr);
copy(filePathsStr);
console.log('Copied to the clipboard as well 😁');
简单方法如下:
6.在 Azure DevOps 中创建访问令牌并使用它进行身份验证 7. 提供代码和令牌管理对令牌的访问权限
谷歌搜索将我发送到这里,尽管问题略有不同。
这个问题[详情]有命令行。 不过,我需要文件列表,如果我能在 GUI 中看到就可以了
这是在 GUI 中查看文件列表的方法:
打开拉取请求
单击[文件已更改]选项卡
对话 0 提交 3 [文件已更改] 8
单击 [文件已更改] 下一行中“n 个文件”后的下拉菜单
所有提交的更改 v ... [8 个文件 v] ... +638 −266
(点击上行文件后面的 v,下拉菜单)
我找不到一种方法来查看 GitHub 中已更改文件的列表(即没有差异和注释),但可以在浏览器控制台中使用这一行来完成:
Array.from(document.getElementsByClassName('js-details-target')).forEach((e) => {e.click();})
这将折叠所有差异块,只留下文件名。
根据@AdamHickey's 2019回答,将标签的类更新为“Link--primary”,如下
// the changes were only done on the **line** below
const fileElems = document.querySelectorAll('#files div.file-info a.Link--primary');
const filePaths = [];
for (let a of fileElems) {
filePaths.push(a.title);
}
const filePathsStr = filePaths.join('\n');
console.log(filePathsStr);
copy(filePathsStr);
console.log('Copied to the clipboard as well 😁');
zoispag的answer的替代方案(使用新的GitHub CLI 2.14.5)和
gh pr diff
:
gh pr diff --name-only
但是,正如Dean Radcliffe在评论中指出的那样,如果 PR 太大,则有限制 - 20000 行。
受到@AdamHickey的启发,这个答案不再起作用了。所以,我创建了一个工作脚本。
let changes = document.getElementsByClassName("file-info");
let files = []
for(let i =0;i<changes.length;i++)
{
files.push(changes[i].getElementsByClassName("link-gray-dark")[0].title);
}
navigator.clipboard.writeText(JSON.stringify(files));
免责声明:如果有一天 html 的结构发生变化,这可能会停止工作。
有一些方法可以查找已更改的文件,但您必须对比较的内容进行试验。 我在 GitHub Actions 中主要使用的两个示例是:
git --no-pager diff --name-only --diff-filter=ACMRT ${{github.event.pull_request.base.sha}} ${{ github.event.pull_request.head.sha }}
和:
git --no-pager diff --name-only --diff-filter=ACMRT ${{github.event.pull_request.base.sha}} ${{github.sha}}
这会产生一个列表,例如:
.github/workflows/potato.yml
.tomato.yml
app/assets/javascripts/cucumber.js
根据您的需要尝试 SHA 签名。
一个完全 hacky 的方法,不是 100% 万无一失,但是实现此目的的简单方法是,对于 PR 中涉及的所有文件来说:
pbpaste | grep 'src/'
,例如,如果您有一个java项目。这会将剪贴板上的文本发送到 grep。