我一直在寻找一种方法来在列表中的暂存过程(未提交)中获取存储库中的所有已更改文件,但是all I can find is how to do it between 2 commits。
执行git status
会显示已修改文件的列表,但我需要以我可以使用脚本轻松解析的格式获取列表。
我该如何做到这一点?
答案 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
表示其他人(未跟踪)。