由于官僚主义的原因,我需要获取仓库中所有已更改文件的列表以备报告使用(我从现有的源代码开始)。
我应该运行什么命令才能获取此列表?
由于官僚主义的原因,我需要获取仓库中所有已更改文件的列表以备报告使用(我从现有的源代码开始)。
我应该运行什么命令才能获取此列表?
对于在给定 SHA 和当前提交之间更改的文件:
git diff --name-only <starting SHA> HEAD
或者,如果您想要包含已更改但尚未提交的文件:
git diff --name-only <starting SHA>
更普遍地,以下语法总是会告诉你在两个提交之间(由它们的 SHA 或其他名称指定)哪些文件发生了变化:
git diff --name-only <commit1> <commit2>
使用 --name-status
而不是 --name-only
将会展示文件的变化情况和名称。
git diff --name-only <SHA> <SHA>^
- thebugfinder要找到自上次提交以来修改过的所有文件的名称:
git diff --name-only
或者(如果需要更多信息,包括未跟踪的文件):git status
git status --uno
命令可以加快未跟踪文件的枚举过程。 - SouthSun列出所有未暂存的已跟踪修改文件:
git diff --name-only
列出所有已经暂存的被跟踪的修改过的文件: git diff --name-only --staged
列出所有已暂存和未暂存的已跟踪变更文件:
{ git diff --name-only ; git diff --name-only --staged ; } | sort | uniq
列出所有未跟踪的文件(即由git status
列出的文件,不包括任何已被忽略的文件):git ls-files --other --exclude-standard
如果您正在使用这些命令来编写shell脚本,并且想要通过程序化方式检查这些命令是否返回了任何内容,那么您将会对git diff
的--exit-code
选项感兴趣。
当我添加/修改/删除了许多文件(自上次提交以来),我喜欢按时间顺序查看这些修改。
为此,我使用:
列出所有未暂存的文件:
git ls-files --other --modified --exclude-standard
获取每个文件的最后修改日期:
while read filename; do echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename; done
xargs -0 stat -c '%y %n' --
将它们从最早到最近排序:
sort
使用别名可以更方便地使用:
alias gstlast='git ls-files --other --modified --exclude-standard|while read filename; do echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename; done|sort'
或者(更短更高效,感谢ruvim)
alias gstlast='git ls-files --other --modified --exclude-standard|xargs -0 stat -c '%y %n' --|sort'
例如:username@hostname:~> gstlast
2015-01-20 11:40:05.000000000 +0000 .cpl/params/libelf
2015-01-21 09:02:58.435823000 +0000 .cpl/params/glib
2015-01-21 09:07:32.744336000 +0000 .cpl/params/libsecret
2015-01-21 09:10:01.294778000 +0000 .cpl/_deps
2015-01-21 09:17:42.846372000 +0000 .cpl/params/npth
2015-01-21 12:12:19.002718000 +0000 sbin/git-rcd
我现在可以按照时间顺序查看我的修改,从最旧的到最近的。
我需要列出在两个提交之间更改了内容的文件列表(仅包括添加的A
或修改的M
),因此我使用了:
git diff --name-only --diff-filter=AM <from_commit_hash> <to_commit_hash>
--diff-filter
选项(也可以参考man git diff
):
如果您想同时列出状态(例如
--diff-filter=[(A|C|D|M|R|T|U|X|B)…[*]]
选择仅包含以下类型的文件: 添加的 (
A
), 复制的 (C
), 删除的 (D
), 修改的 (M
), 重命名的 (R
), 类型改变的 (例如常规文件、符号链接和子模块等) (T
), 未合并的 (U
), 未知的 (X
) 或配对已断开的 (B
)。可以使用任何过滤器字符的组合(包括不使用任何字符)。当在组合中添加“*”(全选或不选)时,如果比较中存在任何匹配其他条件的文件,则选择所有路径;如果没有与其他条件匹配的文件,则什么都不选。此外,这些大写字母可以小写以排除。例如,
--diff-filter=ad
排除添加和删除的路径。请注意,并非所有的差异都可以展现出所有类型。例如,从索引到工作树的差异永远不能有添加条目(因为差异中所包括的路径集受索引中内容的限制)。类似地,如果禁用了复制和重命名类型的检测,则不能出现复制和重命名条目。
A
/ M
),请将 --name-only
更改为 --name-status
:git diff --name-status --diff-filter=AM <from_commit_hash> <to_commit_hash>
git status
命令和类似下面的 grep
命令获取未暂存的修改列表。例如:git status -s | grep M
:root@user-ubuntu:~/project-repo-directory# git status -s | grep '^ M'
M src/.../file1.js
M src/.../file2.js
M src/.../file3.js
....
使用 git show
命令可以得到类似的结果。若要查看提交记录(就像在 git log
视图中一样),以及包含其中的文件列表,可以使用以下命令:
git show --name-only [commit-id_A]^..[commit-id_B]
当你想要展示的最后一次提交为[commit-id_B]
,而初始提交为[commit-id_A]
时,请注意使用^
符号。如果不使用该符号,则无法展示[commit-id_A]
信息。
获取修改过的文件列表并将其保存到文本文件中最简单的方法是:
git diff --name-only HEAD^ > modified_files.txt
如果您想要检查更改的文件,需要注意许多小细节,例如最好使用哪种方法,
例如,如果您想要检查哪些文件已更改,请键入
git status -- 它将显示具有更改的文件
然后,如果您想要知道要进行的更改,可以通过以下方式进行检查,
git diff -- 将显示所有文件中的所有更改
仅当只修改一个文件时才是最佳选择
如果您想要检查特定文件,则使用
git diff
一些在GitHub Actions中针对类型(pull_request或合并到主分支)适用于我的筛选器有:
git --no-pager diff --name-only --diff-filter=ACMRT ${{github.event.pull_request.base.sha}} ${{ github.event.pull_request.head.sha }}
git --no-pager diff --name-only --diff-filter=ACMRT ${{github.event.pull_request.base.sha}} ${{github.sha}}
git log -m -1 --name-only --pretty="format:" ${{ github.sha }}
尝试这些,看看哪一个适合您的需求。