İki Git arasında değişen tüm dosyaların listesi nasıl alınır?


178

Bürokrasi nedeniyle, bir rapor için depomdaki tüm değiştirilmiş dosyaların bir listesini almam gerekiyor (mevcut kaynak koduyla başladım).

Bu listeyi almak için ne yapmalıyım?


34
"bürokrasi nedeniyle" xD
ptim

Yanıtlar:


238

Belirli bir SHA ile mevcut taahhüdünüz arasında değiştirilen dosyalar için:

git diff --name-only <starting SHA> HEAD

veya değiştirilmiş ancak henüz taahhüt edilmemiş dosyaları dahil etmek istiyorsanız:

git diff --name-only <starting SHA>

Daha genel olarak, aşağıdaki sözdizimi size her zaman iki taahhüt arasında (SHA'ları veya diğer adlarıyla belirtilen) hangi dosyaların değiştiğini söyleyecektir:

git diff --name-only <commit1> <commit2>

2
ve belirli bir taahhüt için değiştirilmiş dosyaları bilmek istiyorsanız:git diff --name-only <SHA> <SHA>^
thebugfinder

3
--name-statusBunun yerine bayrağı kullanmak, --name-onlydosyaların bir listesini almak ve Eklenen veya Değiştirilen gibi değişiklik durumlarını görmek için kullanışlıdır.
Thane Plummer

@Amber, @Thane Plummer'ın --name-statuskendilerine ne olduğunu gösteren notlarından bahsetmeli
Zoltán Süle

64

Son işleminizden bu yana değiştirilen tüm dosyaların adlarını bulmak için:

git diff --name-only

Veya (izlenmemiş dosyalar dahil olmak üzere biraz daha fazla bilgi için):

git status

48
  • İşaretlenmemiş izlenen tüm değiştirilmiş dosyaları listelemek için :

    git diff --name-only
    
  • Tüm aşamalı izlenen değiştirilmiş dosyaları listelemek için :

    git diff --name-only --staged
    
  • Tüm aşamalı ve etiketsiz izlenen değiştirilmiş dosyaları listelemek için :

    { git diff --name-only ; git diff --name-only --staged ; } | sort | uniq
    
  • İzlenmeyen tüm dosyaları listelemek için (tarafından listelenenler git status, yok sayılan dosyalar dahil değil):

    git ls-files --other --exclude-standard
    

Bir kabuk içinde bu kullanıyorsanız ve bu komutlar bir şey döndürülürse programlı kontrol etmek istiyorsanız, ilgilenen olacağım git diff'ın --exit-codeseçeneği.


16

Birçok dosya eklediğimde / değiştirdiğimde / sildiğimde (son işlemden bu yana), bu değişikliklere kronolojik sırayla bakmak istiyorum.

Bunun için kullanıyorum:

  • Hazırlanmamış tüm dosyaları listelemek için:

    git ls-files --other --modified --exclude-standard
    
  • Her dosya için son değiştirilme tarihini almak için:

    while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done
    

Rağmen ruvim yorumlarda önermek :

xargs -0 stat -c '%y %n' -- 
  • Bunları en eskiden en yeniye doğru sıralamak için:

    sort
    

Bir takma ad kullanımı kolaylaştırır:

alias gstlast='git ls-files --other --modified --exclude-standard|while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done|sort'

Veya ( ruvim sayesinde daha kısa ve daha verimli )

alias gstlast='git ls-files --other --modified --exclude-standard|xargs -0 stat -c '%y %n' --|sort'

Örneğin:

username@hostname:~> gstlast
2015-01-20 11:40:05.000000000 +0000 .cpl/params/libelf
2015-01-21 09:02:58.435823000 +0000 .cpl/params/glib
2015-01-21 09:07:32.744336000 +0000 .cpl/params/libsecret
2015-01-21 09:10:01.294778000 +0000 .cpl/_deps
2015-01-21 09:17:42.846372000 +0000 .cpl/params/npth
2015-01-21 12:12:19.002718000 +0000 sbin/git-rcd

Şimdi modifikasyonlarımı en eskiden en yeniye doğru inceleyebilirim.


Neden xargstek bir çağrı kullanmıyorsunuz stat? Tam bir astar:git ls-files -z --other --modified --exclude-standard | xargs -0 stat -c '%y %n' -- | sort
ruvim

@ruvim Teşekkür ederim. Çok iyi bir öneri. Cevabı, daha fazla görünürlük için yorumunuzu içerecek şekilde düzenledim.
VonC

4

Bu yüzden kullandım iki taahhüt arasında (sadece eklenen veya değiştirilen) arasında içerik değişti dosyaların bir listesine ihtiyacım var:

git diff --name-only --diff-filter=AM <commit hash #1> <commit hash #2>

Git diff belgelerinden farklı fark filtresi seçenekleri :

fark filtre = [(A | Cı | D | E | R | T | u | X | B) ... [*]]

Yalnızca Eklenen (A), Kopyalanan (C), Silinmiş (D), Değiştirilmiş (M), Yeniden Adlandırılan (R) dosyaları türlerini değiştirir (yani normal dosya, sembolik bağlantı, alt modül,…) değiştirilir (T), Birleştirilmemiş (U), Bilinmiyor (X) veya eşleşmeleri Kırık (B). Filtre karakterlerinin herhangi bir kombinasyonu (hiçbiri dahil) kullanılabilir. Kombinasyona * (Tümü veya Hiçbiri) eklendiğinde, karşılaştırmadaki diğer ölçütlerle eşleşen herhangi bir dosya varsa tüm yollar seçilir; diğer ölçütlerle eşleşen dosya yoksa hiçbir şey seçilmez.

Ayrıca, bu büyük harfler dışarıda bırakılmak üzere küçültülebilir. Örneğin --diff-filter = reklam, eklenen ve silinen yolları hariç tutar.

Eğer (örneğin A / M) sıra durumunu listelemek istiyorsanız, değişim --name-onlyiçin --name-status.


3

Değiştirilmemiş etiketsizler listesi git statusve aşağıdaki grepkomut kullanılarak elde edilebilir . Gibi bir şey git status -s | grep M:

root@user-ubuntu:~/project-repo-directory# git status -s | grep '^ M'
 M src/.../file1.js
 M src/.../file2.js
 M src/.../file3.js
 ....

O iki Git kaydedilmesini arasında değiştiğini dosyalar 'için yararlı isnt nedenle bu unstaged değişiklikleri için tek kullanılabileceğini Not
John Vandenberg

2

İle git showbenzer bir sonuç elde edebilirsiniz. İçinde git logyer alan dosyaların listesiyle birlikte taahhüdü ( görünümde göründüğü gibi ) görmek için şunu kullanın:

git show --name-only [commit-id_A]^..[commit-id_B]

[commit-id_A]İlk taahhüt nerede ve [commit-id_B]göstermek istediğinizden daha son taahhüttür.

^Sembolü ile özel dikkat . Bunu koymazsanız, commit-id_A bilgileri konuşlandırılmaz.


1

Değiştirilen dosyaları kontrol etmek istiyorsanız, hangi dosyaların en iyi şekilde değiştiğini kontrol etmek istiyorsanız, örneğin en iyi şekilde kullanmak gibi birçok küçük şeye dikkat etmeniz gerekir.

git status - değişiklikleri içeren dosyaları gösterir

hangi değişikliklerin yapılacağını bilmek istiyorsanız, bu yöntem kontrol edilebilir,

git diff - tüm dosyalardaki tüm değişiklikleri gösterir

yalnızca bir dosya değiştirildiğinde iyi olur

ve belirli bir dosyayı kontrol etmek istiyorsanız

git fark

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.