Git diff --stat tam dosya yolunu göster


104

Yapılırken git diff --statbazı dosyalar depo tabanından tam yolla listelenir, ancak bazı dosyalar şu şekilde listelenir:

.../short/path/to/filename.  

Bu yol ile başlar ...ve sadece kısa yol gösterilir.

git diffBir komut dosyası tarafından kolayca işlenebilmesi için tüm dosyaların tam dosya yolunu listelemek istiyorum . Her git diffzaman tam yolu göstermenin bir yolu var mı

Yanıtlar:


109

git diffKomut isteğe bağlı değerler için gereken --stat:

--stat[=<width>[,<name-width>[,<count>]]]
       Generate a diffstat. You can override the default output width for
       80-column terminal by --stat=<width>. The width of the filename
       part can be controlled by giving another width to it separated by a
       comma. By giving a third parameter <count>, you can limit the
       output to the first <count> lines, followed by ...  if there are
       more.

       These parameters can also be set individually with
       --stat-width=<width>, --stat-name-width=<name-width> and
       --stat-count=<count>.

(Komut dosyası yazmak git diff-treeiçin, daha çok bir "tesisat" komutu olduğu için doğrudan kullanmak isteyebilirsiniz , ancak her iki şekilde de iyi olacağınızdan şüpheleniyorum. --statKullanırken aynı ekstra metne ihtiyacınız olduğunu unutmayın git diff-tree. git diff"Porselen" kullanmak arasındaki temel fark "ön uç ve git diff-treetesisat komutu, yeniden adlandırma algılamanın yapılıp yapılmayacağına karar vermek git diffgibi seçenekler için yapılandırılmış ayarlarınızı arar diff.renames. Bu, artı ön uç , dizin ile bir kaydetmeyi karşılaştırıyorsanız git diffeşdeğerini yapacaktır. git diff-index, örneğin. Başka bir deyişle, git diff yapılandırmanızı okur ve doğru tesisatı otomatik olarak çalıştırır .)


6
git diff --numstat, diff-tree ile aynıdır
cmcginty

1
Son bölümün genişliğini sınırlamak için (+++ / ---) ayrı bir --stat-graph-width=...anahtar kullanabileceğinizi unutmayın . Ayrıca yüksek --stat-graph-width=ve --stat-name-width=yeterli olmadığına dikkat --stat-width=edin, ikisini de kapsayacak kadar büyük ayarlamanız gerekir .
jakub.g

@ jakub.g: iyi nokta. Git kaynağında biraz kazmaya dayalı olarak, bu git 1.7.10 ile birlikte geldi.
torek

4
Bunu küreselleştirmenin bir yolu var mı? Her seferinde yazmak çılgınlık.
Rudie

@Rudie: Ne yazık ki, hayır: değeri diff.statGraphWidthayarlamak için kullanabileceğiniz bir yapılandırma değişkeni var --stat-graph-width, ancak diğerleri varsayılan olarak terminal genişliğinize göre ayarlanıyor . (Öyleyse, alternatif cevap: "evet, terminal pencerenizi 1000 sütun genişliğinde yapın" :-))
torek

22

Komut dosyası işleme için aşağıdakilerden birini kullanmak daha iyi olabilir:

# list just the file names
git diff --name-only
path/to/modified/file
path/to/renamed/file


# list the names and change statuses:
git diff --name-status
M       path/to/modified/file
R100    path/to/existing/file   path/to/renamed/file


# list a diffstat-like output (+ed lines, -ed lines, file name):
git diff --numstat
1       0       path/to/modified/file
0       0       path/to/{existing => renamed}/file

Bunların her biri , alan sonlandırıcı olarak -zkullanan seçenekle birleştirildiğinde sağlam komut dosyası işleme için daha kullanışlı hale gelir NUL.


Testlerime göre, bu komutları kullanarak kaynağın tam yolunu alamıyorsunuz. Şimdilik sadece silinmiş dosyalar için göreli yolları görüyorum. Bunun sadece bu dosyalar için geçerli olup olmadığını bilmiyorum.
GCallie

1
Tüm outpu, ile ilişkili yolları döndürür git rev-parse --show-toplevel. Orijinal sorun, özellikle uzun dosya adları için veya için düşük bir değer olan diffstat'larda bir sorun olan kesilmiş yollarla ilgili idi --stat-name-width. Yukarıdaki komutlar yolları kesmeyecek, ancak yine de depo köküne göre olsa da istendiği gibi "tam" yolu gösterecektir.
cmbuckley

18

Bash kullanıcıları için, $COLUMNSmevcut terminal genişliğini otomatik olarak doldurmak için değişkeni kullanabilirsiniz :

git diff --stat=$COLUMNS

Çok uzun yol adları yine de kesilmiş olabilir; bu durumda, +++ / --- kısmının genişliğini, --stat-graph-widthörneğin bu, terminal genişliğinin 1 / 5'i ile sınırlandırarak azaltabilirsiniz :

git show --stat=$COLUMNS --stat-graph-width=$(($COLUMNS/5))

Daha genel bir çözüm için, tput colsuçbirim genişliğini belirlemek için çıktısını kullanabilirsiniz .


2
Küreselleşmenin bir yolu var mı --stat=$COLUMNS,$COLUMNS? Her seferinde yazmak çılgınlık.
Rudie

@Rudie export COLUMNS, kendi ~/.bashrcve ~/.gitconfigaltında [alias]eklesmart-diff = ! "gitsmartdiff() { git diff $2 --stat=$COLUMNS,$COLUMNS; }; gitsmartdiff"
user151841

@ user151841 Bu yalnızca değişir diff. Ben de birleşme ve çekmeler için çalışmasını istiyorum. (Orada elle bile yapamıyorum.) GIT'in desteklediğini sanmıyorum.
Rudie

@Rudie Çekme veya birleştirme tamamlandıktan sonra, önceki ve yeni hash'ler arasında farklılık yapabilirsiniz.
user151841

2
@ user151841 Elbette, ancak birleştirme zaten bir istatistik özeti veriyor. Parametreler / config olmadan. Tüm 'istatistik özetlerinin' aynı yapılandırmayı kullanması harika olurdu.
Rudie

4

Bir seçenek var --name-only: git diff --name-only. Seçenek ayrıca showve gibi diğer git komutları tarafından da desteklenir stash.

Yollar bu seçenekle kısaltılmıyor.


0

Aşağıdaki git takma adını oluşturdum:

diffstat = ! "gitdiffstat() {  git diff --stat=$(tput cols) ${1:-master} ; }; gitdiffstat"

Komuttan sütun sayısını okur tput cols. Varsayılan olarak farklıdır master, ancak isteğe bağlı olarak başka bir dal belirtebilirsiniz.

$ git diffstat
 .gitalias | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

0

Bulduğum basit bir çözüm bunu yapmaktı: (sadece * nix üzerinde çalışıyor, üzgünüm osx yok)

git diff --stat=$COLUMNS --relative | head -n -1 | cut -c 2- | xargs -d '\n' -P4 printf "$(pwd)/%s\n"

Bu sürüm her ikisi için de çalışıyor, ancak osx'te harika görünmüyor.

git diff --stat=$COLUMNS --relative | sed -e '$ d' | cut -c 2- | xargs -n4 -I{} echo "$(pwd)/{}"

-1

Diff --stat davranışının daha önce dosya yollarını varsayılan olarak sabit bir genişliğe kısaltacağı git 1.7.10 civarında bir yerde değiştiğini buldum - şimdi terminal pencerenizin izin verdiği kadarını gösteriyor. Bu sorunu yaşıyorsanız, 1.8.0 veya daha yeni bir sürüme yükselttiğinizden emin olun.

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.