Git - 在暂存期间列出所有已更改的文件

时间:2017-05-31 17:40:26

标签: git

我一直在寻找一种方法来在列表中的暂存过程(未提交)中获取存储库中的所有已更改文件,但是all I can find is how to do it between 2 commits

执行git status会显示已修改文件的列表,但我需要以我可以使用脚本轻松解析的格式获取列表。

我该如何做到这一点?

5 个答案:

答案 0 :(得分:3)

您可以使用上面提到的命令,然后剪切,选择它以仅获取文件名。

git status -s --porcelain | cut -c4-

git status -s --porcelain | sed -e 's!.*/!!'

如果您希望跟踪未分段的文件。

git status -uno 

答案 1 :(得分:1)

你的问题很好,因为它引导你进入Git索引的第一大秘密:索引充当下一次提交中所有文件的存储区域

换句话说,你有一个当前提交(又名HEAD)和一个工作树(你可以看一下)。但你有这个不可见的区域,临时区域索引缓存(它有三个名称),有每个文件的副本。

Git让你比较其中任何一个:

  • 任意两次提交:git diff commit1 commit2;
  • 索引和工作树:git diff(这是可以提交提交的内容);
  • 任何提交和工作树:git diff commit,例如git diff HEAD - 但此忽略暂存区域;最后,也许你想要的:
  • 任何提交和暂存区域:git diff --cached commit,例如git diff --cached HEAD。如果您省略 commit ,则默认为HEAD,因此git diff --cached可以获得您想要的内容。

您自己的回答提到git status --short(或-s)。这实际上是在内部运行两个 git diff命令。这就是为什么每个状态字母有两列,以及未跟踪文件的两个问号:第一列显示比较HEAD到登台区/缓存/索引的结果,第二列显示结果将staging-area / cache / index与工作树进行比较。

如果您修改了文件changed/file/1尚未将其复制到暂存区域,则HEAD中的文件版本commit与暂存区域中的文件版本匹配。所以第一列的状态为空(无变化)。工作树中文件的副本不同,因此其列为M

如果您git add changed/file/1,则会将其从工作树复制到登台区域,覆盖与HEAD提交匹配的版本。现在git status -s看到第一个比较显示“已修改”,第二个比较显示“相同”,因此M进入第一个列,第二个< / em>列为空白。

您可以再次修改工作树中的文件,然后运行git status -s,这次您将获得两个 M:其中一个说HEAD 1}}和index / staging-area不同,另一个说index / staging-area与工作树不同。

答案 2 :(得分:0)

在我研究这个问题时,我决定查看git status的帮助页面并找到了这个:

-s, --short
       Give the output in the short-format.

--porcelain[=<version>]
       Give the output in an easy-to-parse format for scripts. This is similar to the short output, but will remain stable across Git versions and regardless of user
       configuration. See below for details.

使用git status -s --porcelain会显示以下列表:

 M changed/file/1
 M changed/file/2
 M changed/file/3
?? untracked/
?? untrackedfile.txt
?? untracked/folder/2
?? other/untracked/folder

我还在没有未跟踪文件的存储库上尝试了此操作,M前面的空间仍然存在。

答案 3 :(得分:0)

git diff --cached显示了上演的帅哥。

git diff --cached --name-only列出暂存的文件。

答案 4 :(得分:0)

git ls-files -c列出所有已暂存的文件,-d表示已删除的文件,-m表示已修改,-i表示已忽略,-o表示其他人(未跟踪)。

More about git-ls-files