[英]How to only list .png files that have been modified in Git
如何只列出在Git的当前分支中已修改的png文件?
我的目标是将这些文件复制到其他目录(我需要发送电子邮件)。
假设我有:
$ git status
On branch update_assessment_pt1
Your branch is up-to-date with 'upstream/devel'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: assessment/LWR/validation/HbepR1/analysis/hbepr1_plot.py
deleted: assessment/LWR/validation/HbepR1/doc/figures/AxialPowerProfile.pdf
deleted: assessment/LWR/validation/HbepR1/doc/figures/AxialProfile.pdf
deleted: assessment/LWR/validation/HbepR1/doc/figures/CladDisp.pdf
deleted: assessment/LWR/validation/HbepR1/doc/figures/FissionGas.pdf
modified: assessment/LWR/validation/HbepR1/doc/figures/FissionGas.png
deleted: assessment/LWR/validation/HbepR1/doc/figures/InterGasPress.pdf
deleted: assessment/LWR/validation/HbepR1/doc/figures/Mesh.pdf
deleted: assessment/LWR/validation/HbepR1/doc/figures/Power.pdf
modified: assessment/LWR/validation/HbepR1/doc/figures/Power.png
new file: assessment/LWR/validation/IFA_431/analysis/ifa431_plot.py
modified: assessment/LWR/validation/IFA_431/doc/figures/431_bol_rod_power.png
modified: assessment/LWR/validation/IFA_431/doc/figures/431r1.png
modified: assessment/LWR/validation/IFA_431/doc/figures/431r2.png
modified: assessment/LWR/validation/IFA_431/doc/figures/431r3.png
我将如何获取以下内容,以便复制这些文件?
modified: assessment/LWR/validation/HbepR1/doc/figures/FissionGas.png
modified: assessment/LWR/validation/HbepR1/doc/figures/Power.png
modified: assessment/LWR/validation/IFA_431/doc/figures/431_bol_rod_power.png
modified: assessment/LWR/validation/IFA_431/doc/figures/431r1.png
modified: assessment/LWR/validation/IFA_431/doc/figures/431r2.png
modified: assessment/LWR/validation/IFA_431/doc/figures/431r3.png
使用git diff --cached --diff-filter=M --name-only
来获取这些文件名。 添加-- '*.png'
如果需要将列表过滤为*.png
文件,则添加-- '*.png'
该命令将列出状态为M
(已修改)的所有 to be committed
文件。
在文本中,您首先在当前分支中将它们称为“ 修改” 。 这个短语并不意味着任何特定的东西。 幸运的是,然后您继续显示git status
输出,它们在“ Changes to be committed
。
Git根本不存储差异。 Git将快照 (完整的完整文件)存储在主要存储单元(即提交)中。 这意味着要查看更改 ,您必须选择两个提交:$ old和$ new。 Git将提取两者,然后进行比较。 无论commit $ old和commit $ new有什么区别,Git都会告诉您。 实际更改可以是多个更改状态中的任何一个:
A
办法补充:文件不在$老在$新。 M
表示已修改:$ old和$ new之间的文件不同。 区别仅在于文件的模式 :可执行文件或不可执行文件。 D
表示已删除:文件位于$ old中,而不位于$ new中。 R
, C
, T
和其他一些罕见的情况也可能发生,尽管其中一些可能需要额外的标志来git diff
:例如,除非启用了重命名检测,否则您不会看到R
状态。 (在最新的Git版本中,重命名检测默认为打开 ,而在较早的Git版本中为关闭 。) 使用--name-status
, git diff
将显示文件名和状态字母,而不是实际的差异。 (请尝试一下。)-- --diff-filter
参数可让您告诉Git: 仅告诉我有关状态符合我选择的字母的文件。
注意,顺便说一句,特殊名称HEAD
始终表示当前commit 。 不管如何使该提交成为当前提交都无关紧要,尽管一种典型的方法是使用git checkout
:例如,您通过其哈希ID git checkout
一个提交,现在该签出被检出并且是当前提交。 或者,您可以git checkout
一个分支名称,并且该分支的尖端提交现在已经退出,并且是当前的提交。 当前提交始终为1 ,您可以通过将名称HEAD
都写成大写来命名它。 2
上面所有讨论比较提交的问题 ,但是还有两个文件可以存在的地方,它们不是提交。 请注意, 这两个位置都是临时的:它们通过各种操作被擦除,并且一旦擦除, 就无法在Git中恢复:您必须从这些临时位置复制到实际的提交中,以使文件永久化。 一旦提交了文件,它们就会一直冻结,并且只要提交本身存在(将来可能是“永远”,或者只要存储库存在),将来就可以恢复为有用的形式。 。
这两个地方是:
现在索引中的文件已准备好提交。 即使索引副本与当前( HEAD
)提交副本匹配,现在将要提交的每个文件都在索引中。
您可以随时将HEAD
提交与索引中的内容进行比较。 git diff --cached
是执行此操作的命令。 对于HEAD
和/或索引中的每个文件,Git会比较文件的两个副本。 如果它们不同,则文件被修改。 如果索引文件存在,但HEAD
没有这样的文件,则会添加该文件。 如果该文件存在于HEAD
但不存在于索引中,则该文件将被删除。
您还可以随时将HEAD
与工作树进行比较,或将索引与工作树进行比较。 执行此命令的命令是git diff HEAD
和git diff
(无名称)。 同样,对于左侧的每个文件( HEAD
或索引)和右侧的每个文件(在工作树中),Git都会比较文件的两个副本。
最后,请注意git status
运行两个 git diff
。 它执行快速git diff --cached
比较HEAD
和索引。 不管这里有什么不同, git status
列出要提交的文件。 它还执行快速git diff
(除了--name-only
之外,没有其他参数)来比较索引与工作树。 不管这里有什么不同, git status
将该文件列出为未暂存为commit的更改 。
您想要比较HEAD
与索引,因此想要git diff --cached
。 然后你想只列出那些文件M
odified,这样你就可以添加--diff-filter=M
。 您不想看到实际的差异,甚至也不想看到状态字母。 请仅提供文件名!-因此您可以添加--name-only
。 您还只想列出名称与*.png
匹配的文件,因此添加-- '*.png'
引号可保护*
不受外壳影响; 我们希望Git看到*
以便Git可以将它当作pathspec来获取。
1实际上,实际上几乎总是这样 。 HEAD
存在一个特殊状态,并包含一个分支名称,但是分支名称本身不存在。 当您创建新的完全空的存储库时,通常会出现这种状态。 Git需要像master
这样的分支名称来标识一些现有的有效提交哈希ID。 没有提交,因此没有有效的哈希ID,因此不允许master
本身存在。 尽管如此, HEAD
拥有名称 master
,因此Git将在您进行第一次提交时创建 master
分支。
2在Windows和MacOS上,有时可以使用head
(小写)代替HEAD
(全部大写)。 如果您开始使用git worktree add
, git worktree add
这种行为,因此这是一个坏习惯。 如果您不喜欢用大写字母键入HEAD
,请考虑使用符号@
,它是HEAD
的同义词。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.