我正在调查git存储库。我想在每次提交中获取已更改文件的列表。
所以,我所做的是通过命令
访问每次提交git reset --hard <commitId>
然后,我用了
git show --pretty="format:" --name-only #{commitId}
这个问题是它在我不想要的commitId中提供了已删除的文件。我也试过了:
git ls-files
它不会返回已删除的文件,但是,它会返回所有现有文件的列表,这些文件是新的或在之前的提交中创建的。
示例:
>commit 1
add "file1"
add "file2"
>commit 2
change "file1"
>commit 3
add "file3"
delete "file2"
所以在这种情况下,我将访问每个提交。并且,如果我在提交1中,我想获得“file1”和“file2”的列表。如果我在提交2中,如果我在提交3中,我将获得“file1”和“file3”。
有什么想法吗?
答案 0 :(得分:8)
尝试使用此命令:
git show --diff-filter=AM --pretty="format:" --name-only #{commitId}
您在原始问题中提到的是添加了--diff-filter
标记,仅限于添加(A
)或修改(M
)的文件。有关您可以限制的文件类型的完整列表,请查看git show的文档。
正如@MauricioTrajano在回答中提到的,您不需要重置为使用git show
进行调查的提交。您需要知道的只是提交的SHA-1哈希,只需在相关分支上使用git log
即可找到。
答案 1 :(得分:2)
为了做到这一点,您不必将HEAD重置为先前的提交,即您不必丢失本地更改,git diff
允许您在任何两个提交之间进行比较,只要您保密哈希。在你的情况下,你可以这样做:
git diff {COMMIT_1_HASH} {COMMIT_2_HASH} --name-only --diff-filter=AM
这可用于查看在任意数量的提交之间添加和更改的文件。
如果你想只为一次提交添加和修改文件,那么只需使用你想要查看的提交后的提交哈希。
答案 2 :(得分:1)
要获取所有已更改文件的列表(不包括所有已删除文件),请使用 --diff-filter=d
,如下所示:
# see list of changed, but NOT 'd'eleted files since `from_commit_hash` to now
git diff --name-only --diff-filter=d from_commit_hash
# OR, specifying a range of commits:
git diff --name-only --diff-filter=d from_commit_hash to_commit_hash
# or (same thing)
git diff --name-only --diff-filter=d from_commit_hash..to_commit_hash
您可以通过使用--name-status
查看文件名和它们的更改状态来根据已更改文件的完整列表确认这一点:
git diff --name-status from_commit_hash
# OR, specifying a range of commits
git diff --name-status from_commit_hash to_commit_hash
# or (same thing)
git diff --name-status from_commit_hash..to_commit_hash
请注意,我认为 --diff-filter=d
比 --diff-filter=AM
更好,因为前者包括所有除外'd'eleted文件,而后者排除所有内容(包括删除的文件)除了“添加”和“修改”文件。因此,前者更具包容性,只排除您真正想排除的内容,使其更好。
git diff --diff-filter=
文档 here 或使用 man git diff
。