列出 Git/GitHub 中拉取请求中更改的所有文件

问题描述 投票:0回答:12

有没有办法(从命令行)列出 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 github pull-request
12个回答
61
投票

一般来说,您可以使用

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
中删除,我相信它应该可以工作。


41
投票

使用 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

11
投票

特别对于 GitHub,这可以使用 REST API 来完成

GET /repos/:owner/:repo/pulls/:pull_number/files

您可以使用 GitHub 库 之一来实现此目的。


6
投票

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 😁');

2
投票

简单方法如下:

  1. 为 POST 请求生成以下 url https://dev.azure.com/**{OranizationName}**/_apis/Contribution/HierarchyQuery/project/**{ProjectID}**?api-version=5.0-preview.1
  2. 请参阅此链接以获取您需要的任何值 https://learn.microsoft.com/en-us/rest/api/azure/devops/?view=azure-devops-rest-5.1
  3. 使用下面的Json作为请求参数 {“contributionIds”:[“ms.vss-code-web.pr-detail-data-provider”],“dataProviderContext”:{“properties”:{“pullRequestId”:{PullRequestID},“repositoryId”:“ {repositoryId}","sourcePage":{"url":"https://dev.azure.com/{组织名称}/{项目名称}/_git/{存储库名称}/pullrequest/ {PullRequestID}?_a=文件"}}}}
  4. 发送 POST 请求
  5. 从突出显示的属性中获取计数以获取每个 PR 的文件计数

6.在 Azure DevOps 中创建访问令牌并使用它进行身份验证 7. 提供代码和令牌管理对令牌的访问权限


1
投票

谷歌搜索将我发送到这里,尽管问题略有不同。

这个问题[详情]有命令行。 不过,我需要文件列表,如果我能在 GUI 中看到就可以了

这是在 GUI 中查看文件列表的方法:

  1. 打开拉取请求

  2. 单击[文件已更改]选项卡

    对话 0 提交 3 [文件已更改] 8

  3. 单击 [文件已更改] 下一行中“n 个文件”后的下拉菜单

    所有提交的更改 v ... [8 个文件 v] ... +638 −266

(点击上行文件后面的 v,下拉菜单)


1
投票

我找不到一种方法来查看 GitHub 中已更改文件的列表(即没有差异和注释),但可以在浏览器控制台中使用这一行来完成:

Array.from(document.getElementsByClassName('js-details-target')).forEach((e) => {e.click();})

这将折叠所有差异块,只留下文件名。


1
投票

根据@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 😁');

1
投票

zoispaganswer的替代方案(使用新的GitHub CLI 2.14.5)和

gh pr diff

gh pr diff --name-only

来自 PR 6074问题 6060

但是,正如Dean Radcliffe评论中指出的那样,如果 PR 太大,则有限制 - 20000 行。


0
投票

受到@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 的结构发生变化,这可能会停止工作。


0
投票

有一些方法可以查找已更改的文件,但您必须对比较的内容进行试验。 我在 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 签名。


0
投票

一个完全 hacky 的方法,不是 100% 万无一失,但是实现此目的的简单方法是,对于 PR 中涉及的所有文件来说:

  • 选择 PR 页面中的所有文本,然后将其复制到剪贴板(所以在 mac 上基本上是 CMD+A、CMD+C)
  • 运行
    pbpaste | grep 'src/'
    ,例如,如果您有一个java项目。这会将剪贴板上的文本发送到 grep。
  • 也许你很幸运,这对你有用(如果你有一个 java 项目,可能会这样)
  • 如果没有,请将 grep 部分更改为希望针对项目中的文件的内容
© www.soinside.com 2019 - 2024. All rights reserved.