繁体   English   中英

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

[英]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中。
  • RCT和其他一些罕见的情况也可能发生,尽管其中一些可能需要额外的标志来git diff :例如,除非启用了重命名检测,否则您不会看到R状态。 (在最新的Git版本中,重命名检测默认为打开 ,而在较早的Git版本中为关闭 。)

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

注意,顺便说一句,特殊名称HEAD始终表示当前commit 不管如何使该提交成为当前提交都无关紧要,尽管一种典型的方法是使用git checkout :例如,您通过其哈希ID git checkout一个提交,现在该签出被检出并且是当前提交。 或者,您可以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 它执行快速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 addgit worktree add这种行为,因此这是一个坏习惯。 如果您不喜欢用大写字母键入HEAD ,请考虑使用符号@ ,它是HEAD的同义词。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM