问题 如何在不知道分支名称或跟踪内容的情况下获取要由`git pull`更新的文件列表?


如何获取即将更新(或刚刚更新)的文件列表 git pull 所以我可以解析它们并在脚本中采取适当的措施?

接受的答案 这个看似相似的问题 告诉我,我可以获得一份提交列表

git fetch && git log master..origin/master

但这对我没有好处,因为我需要一个文件列表,而我的脚本不能假设分支是 master 或者当前分支正在跟踪 origin/master

通过一些实验(以及@ Jonathan的评论),我发现了这一点

git fetch && git diff master origin/master --name-only

几乎就在那里,但现在我需要找到一种方法来获取当前分支及其跟踪的内容,以便我可以执行类似这样的操作(python):

"git fetch && git diff %s %s --stat" % (this_branch, tracked_branch)

我觉得我大部分都在那里,因为现在我只需要知道如何获得当前分支及其跟踪的内容,但我已经给出了更广泛的背景,希望有人知道更简单的方式解决这个问题git incoming --files 会好的 ;)


11492
2017-12-15 15:37


起源

对于机器消耗, --name-only 可能更好 --stat。除了不必剥离 | 72 ++-- 最后,它不会截断带有省略号的文件名。不确定这是否可以帮助您解决实际问题,但我只是想指出它。 - Jonathan
它确实有帮助,谢谢你:)我会更新这个问题。 - meshy
@Jonathan:对于机器消耗,如果你想知道差异大小,你可以使用 --numstat 不 --stat。 - Cascabel


答案:


假设您知道遥控器的名称(在我的示例中,来源),那么您可以简单地去:

git fetch && git diff --name-only ..origin

templates/shows/showBase.html
templates/shows/showList.html
templates/shows/showListEntry.htm

或者,如果您想要分类为单个提交,您可以使用whatchanged:

git fetch && git whatchanged --name-only ..origin

commit fcb1b56d564fe85615ecd6befcd82f6fda5699ae
Author: Grambo <email@email>
Date:   Mon Dec 12 23:36:38 2011 +0000

    Hooked "I've Seen This" button up to "Review Show" dialog

templates/shows/showBase.html
templates/shows/showList.html
templates/shows/showListEntry.htm

commit xasdasdsada......

11
2017-12-15 15:43



git fetch && git diff --name-only ..origin 正是我需要的:)我很确定遥控器永远是“原点”而不管分支,因为所有东西都是直接从bitbucket克隆的。谢谢,接受:) - meshy
whatchanged --name-only 几乎相当于 log --name-only (如果有区别,我不知道)。 - Cascabel
我在我的本地存储库上运行命令,而我在master分支上,远程存储库上的master是一个版本。但我得到这个错误 - fatal: ambiguous argument '..origin': unknown revision or path not in the working tree. Use '--' to separate paths from revisions, like this: 'git <command> [<revision>...] -- [<file>...]' - Sandeepan Nath
我必须做 git diff --name-only ..origin/master - Sandeepan Nath
此外,当实际发生获取时,除了文件名更改外,它还会显示一些信息。例如。 - remote: Counting objects: 4, done. remote: Compressing objects: 100% (2/2), done. remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (4/4), done. From <remote repository url> b2c98d5..9de3c78 master -> origin/master test/dummy.txt - Sandeepan Nath


比@ obmarg的答案更通用的解决方案是:

git fetch && git diff --name-only @ @{u}

这里 @ 是一个快捷方式 HEAD 而这又是指向您当前签出的分支的指针。 @{u} 要么 @{upstream} 表示跟踪分支 HEAD。所以没有关于当前分支的硬编码假设(master),遥控器的名称(origin)或跟踪分支的名称(origin/master) 是必要的。

如果要使用其他分支执行此操作,请使用以下命令:

git fetch && git diff --name-only master master@{u}

的语法 @{u} 解释说 git help revisions, 搜索 upstream


1
2017-09-01 17:11