[英]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.