簡體   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