如何仅列出已在Git中修改的.png文件

dyl*_*njm 1 git bash cp

如何只列出在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
Run Code Online (Sandbox Code Playgroud)

我将如何获取以下内容,以便复制这些文件?

    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
Run Code Online (Sandbox Code Playgroud)

tor*_*rek 7

使用git diff --cached --diff-filter=M --name-only获得这些文件的名称。-- '*.png'如果需要将列表过滤为仅*.png文件,请添加-该命令将列出状态为(已修改)的任何 to be committed文件M

避免成为“使用此魔术命令”答案的注意事项

在文本中,您首先在当前分支中将它们称为“ 修改”。这个短语并不意味着任何特定的东西。幸运的是,您随后继续显示git status输出,它们在的下面列出Changes to be committed

Git根本不存储差异。Git将快照(完整的完整文件)存储在主要存储单元(即提交)中。这意味着要查看更改,您必须选择两个提交:$ old和$ new。Git将提取两者,然后进行比较。无论commit $ old和commit $ new有什么区别,Git都会告诉您。实际更改可以是多个更改状态中的任何一个:

  • A 表示已添加:文件不在$ old中,而在$ new中。
  • M表示已修改:$ old和$ new之间的文件不同。区别仅在于文件的模式:可执行文件或不可执行文件。
  • D 表示已删除:文件位于$ old中,而不位于$ new中。
  • RCT,也可发生和其他一些罕见的情况下,虽然有些人可能需要额外的标志来git diff:你不会看到一个R状态,除非你能够重命名检测,例如。(在最新的Git版本中,重命名检测默认为打开,而在较早的Git版本中为关闭。)

使用--name-statusgit diff将显示文件名和状态字母,而不显示实际的差异。(尝试一下即可看到。)该--diff-filter参数使您可以告诉Git:仅告诉我有关状态符合我选择的字母的文件。

注意,顺便说一句,特殊名称HEAD始终表示当前的commit。不管如何使该提交成为当前提交都无关紧要,尽管一种典型的方式是使用git checkoutgit checkout例如,通过其哈希ID提交一个提交,并且该签出现在已被检出并且是当前提交。或者,您git checkout是一个分支名称,并且该分支的最尖端提交现在已退出并且是当前提交。当前提交总有1个,您可以通过用HEAD大写字母写名字来命名它。2

上面所有讨论比较提交的问题,但是还有两个文件可以存在的地方,它们不是提交。请注意,这两个位置都是临时的:它们通过各种操作被擦除,并且一旦擦除,就无法在Git中恢复:您必须从这些临时位置复制到实际的提交中,以使文件永久化。一旦提交了文件,它们就会一直冻结,并且将来只要提交本身存在就可以恢复为有用的形式(这往往是“永远的”,或者只要存储库存在) 。

这两个地方是:

  • 指数,其中的Git也称临时区域或(很少)的缓存,并
  • 工作树工作树或任何关于这个名字的几个变种。

现在索引中的文件已准备好提交。 每一个将要提交的文件在指数现在,即使索引拷贝当前(匹配HEAD)提交副本。

您可以随时将HEAD提交内容与索引中的内容进行比较。执行此操作的一个命令是git diff --cached。对于HEAD索引中和/或索引中的每个文件,Git都会比较文件的两个副本。如果它们不同,则文件被修改。如果索引文件存在,但是中没有这样的文件HEAD,则会添加该文件。如果文件存在于HEAD索引中但不存在于索引中,则将其删除。

您还可以随时将HEAD其与工作树进行比较,或者将其与工作树进行索引。执行此命令的命令是git diff HEADgit diff(无名称)。同样,对于左侧(HEAD或索引)上的每个文件以及右侧(在工作树中)的每个文件,Git都会比较文件的两个副本。

最后,请注意git status运行两个 git diff s。它可以快速git diff --cached比较HEADvs索引。不管这里有什么不同,都会git status列出要提交的文件。它还可以快速git diff(除之外没有其他参数--name-only)比较索引与工作树。无论此处有何不同,都git status将该文件列出为未暂存为commit的更改

您想比较HEADvs索引,所以想要git diff --cached。然后,您只想列出经过M整理的文件,因此可以添加--diff-filter=M。您不想看到实际的差异,甚至也不想看到状态字母。请仅提供文件名!—因此您可以添加--name-only。您还只想列出名称与匹配的文件*.png,因此添加-- '*.png'—引号可以防止*shell进入;我们希望Git能够看到Git*以便Git可以将其视为pathspec-以获取这些。


1实际上,实际上几乎总是这样。存在一个特殊状态,其中HEAD包含分支名称,但是分支名称本身存在。当您创建新的完全空的存储库时,通常会出现这种状态。Git需要一个分支名称,master以标识一些现有的有效提交哈希ID。没有提交,因此没有有效的哈希ID,因此master不允许其本身存在。尽管如此,HEAD持有的名称 master,这样Git会创建master时,你的第一次提交分支。

2在Windows和MacOS上,有时可以使用head(小写)代替HEAD(全部大写)。如果您开始使用git worktree add,则会有不良行为,因此这是一个坏习惯。如果您不喜欢HEAD用大写字母输入,请考虑使用符号@,它是的同义词HEAD

  • 也许您应该在网上发布git教程。您的解释很好,很有启发性。 (2认同)