【问题标题】:List all files changed in a pull request in Git/GitHub列出 Git/GitHub 中拉取请求中更改的所有文件
【发布时间】:2014-08-01 01:38:15
【问题描述】:

有没有办法(从命令行)列出在 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


    【解决方案1】:

    一般来说,您可以使用git diff --name-only 列出在任意两次提交之间更改的文件:

    How to list only the file names that changed between two commits?

    这里的问题似乎是确定“合并基础”。如果所有分支都来自 master,那么你可以这样做:

    git --no-pager diff --name-only FETCH_HEAD $(git merge-base FETCH_HEAD master)

    这将显示FETCH_HEADmaster 分支到当前FETCH_HEAD 之间的变化。我在本地对此进行了测试,PR 分支从master 中删除,我相信它应该可以工作。

    【讨论】:

    • 我对@9​​87654329@ 有点困惑...如果在提交 PR 后对master 进行了更改,此命令会包含这些更改吗? (我不希望他们被包括在内)
    • 是的,但您不想测试这些更改吗?如果 A 在 PR 中更改,而 B 在 PR 后更改在 master 上,则 B 和 A 之间可能存在交互,使得 A 的测试通过但 B 的测试失败。
    • 你实际上可以写得更简单:git --no-pager diff --name-only FETCH_HEAD...master(注意三个点)。有关详细信息,请参阅here
    • ostrokach:你是说git --no-pager diff --name-only FETCH_HEAD...master 等价于git --no-pager diff --name-only FETCH_HEAD $(git merge-base FETCH_HEAD master)?我在本地尝试过,但没有得到相同的结果。
    • 使用FETCH_HEAD 通常是有问题的,因为它可以指向多个分支,因此您可能会看到此 PR 与其他分支之间的差异,而不仅仅是 master。它适用于 OP 的情况,因为它们以干净的 git clone 开头,但通常在 OP 的情况下(因为 git checkoutgit --no-pager diff --name-only master...HEAD 有效并且更安全,因为它只会与 master 分支进行比较.
    【解决方案2】:

    使用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 2615gh pr_files 2615 | cat 调用它

    gh pr_files 2615 | cat
    

    【讨论】:

    • 你太棒了@zoispag 我在脚本中使用它来为 PR 创建清单。谢谢?
    【解决方案3】:

    专门针对 GitHub,this can be accomplished using the REST API

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

    您可以为此使用GitHub libraries 之一。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        虽然问题略有不同,但 Google 搜索将我发送到此处。

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

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

        1. 打开拉取请求

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

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

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

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

        (点击v,下拉,在上一行文件之后)

        【讨论】:

        • 谢谢。那很有帮助。 ??
        【解决方案6】:

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

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

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

        【讨论】:

        • 这也可以通过按“alt”键(或 Mac 上的“option”)并单击任何文件旁边的倒插入符号图标来完成,它会折叠所有文件:github.blog/changelog/…
        【解决方案7】:

        这里是简单的方法:

        1. 为 POST 请求生成下面的 url https://dev.azure.com/**{OranizationName}**/_apis/Contribution/HierarchyQuery/project/**{ProjectID}**?api-version=5.0-preview.1
        2. 请参阅此链接以获取您需要的任何值 https://docs.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/{OrganizationName}/{ProjectName}/_git/{RepositoryName}/pullrequest/{PullRequestID}?_a=files"}}}}
        4. 发送 POST 请求
        5. 从突出显示的属性中获取计数以获取每个 PR 的文件计数

        6。在 Azure DevOps 中创建访问令牌并将其用于身份验证 7. 提供对令牌的代码和令牌管理访问权限

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              猜你喜欢
              • 2020-06-09
              • 2013-06-09
              • 1970-01-01
              • 2022-01-10
              • 1970-01-01
              • 2019-03-07
              • 2013-07-07
              • 2018-07-22
              • 1970-01-01
              相关资源
              最近更新 更多