2012-04-17 19 views
5

Aşağıdaki tabloyu göz önünde bulundurun:Orijinal adı bilinen yeniden adlandırılmış bir dosyanın yeni yolu nasıl bulunur?

Yerel şubemde çalışıyorum, ana dalda yeniden işlem tamamlandı. Şimdi bazı dosyalar (sınıflar) yeniden adlandırıldı ve/veya yeni konumlara taşındı. Birleştirirken eksik sınıflar nedeniyle çok fazla sayıda ithalat hatası alıyorum. A yılında

--A--B--C--D--E-- (master) 
    \   \ 
    F--G--H--I--J (topic) 

eski isimler i F--G--H--I kullanılan wich vardır.

B--C--D--E'da dosyalar, E numaralı yeni dosya adlarıyla sonuçlanacak şekilde yeniden oluşturulmuştur. zincirli, Bunun nedeni benim dalında eksik refactorings birçok (derleme) hataları ile J yılında

B: path/to/File.java    
-> C: path/to/BetterName.java 
-> D: better/package/BetterName.java 
-> E: final/package/FinalName.java 

gibi Şimdi birleştirme sonuçlarını yeniden adlandırır. ben hala kırık yapı düzeltmek için final.package.FinalName

yerine path.to.File bakınız Çünkü (i eski sınıflar için yeni isimler bilmemiz gerekir.

olan tüm yeniden adlandırmaları almak için bir git komutu var mı Belirli bir dosyaya uygulandı?

+0

betiğinize çalışır bir seçenek alias.history=!bash -ic 'git_file_history "[email protected]"' - eklendi? eğer evet – CharlesB

+0

sorunuzu alamıyorum Evet işe yarıyor ama yukarıdaki senaryodan daha basit bir çözüm olup olmadığını merak ediyordum. Her dosya için bunu yapmak zorundayım. – helt

+0

'-M' seçeneğiyle birlikte isimleri bulmak için' git log' komutunu belirtmeniz gerekir. Daha sonra sadece isimleri raporlamak istiyorsunuz ve bu ''diff-filter' seçeneği ile yapılıyor. Cevabım için daha fazla ayrıntı ekledim. –

cevap

0

Git, dosyaların yeniden isimlerini bulmalı, ancak dosyada% 50 veya daha fazla satır değiştiyse, artık bir yeniden adlandırma olarak kabul edilmeyecektir. Eğer isterseniz, eşik değeri

İşte bunu yapmak için komut:

git log -M --diff-filter=R --stat 

Sadece size isimleri gösterecektir. Varsayılan% 50 dışında başka bir şeye eşiği değiştirmek isterseniz, sadece M seçeneğine numara ekleyebilirsiniz:

git log -M90 --diff-filter=R --stat 

değiştirildi olarak içerikleri artık tarafından değişip değişmediğini sadece bir dosya ele alacağız

GÜNCELLEME% 10'dan:

, tüm ara aşamaları atlayarak yerine fark kullanın. Git, sizin adınız içindeyken sizin adınıza uygun olanları takip edecektir: konu dalında olduğunuz zaman:

git diff -M --diff-filter=R --name-status ..master | cut -f2- 

.

Daha sonra, referanslarınızı ayarlamak için bir grup sed talimatı vermek üzere bunu borulayabilirsiniz.

+0

birden çok kez yeniden adlandırılmış olduğunu çok önemli olduğunu düşünüyorum ama hala benim hedefe ulaşmak için kazımak zorundayım – helt

+0

ne istiyorsunuz? Çıkışı beğeninize göre biçimlendirebilirsiniz. İhtiyacınız olursa, birkaç komut daha verebilmelisiniz. Tarihine yürümene gerek yok. –

+0

'git log -M --diff-filter = R - name-status --reverse ', gerekli sırada (en eski) tüm yeniden adların listesini verir. Ama SADECE eski adı var. Sorun, eski ismin doğrudan yeniden adlandırılmasını bulmak değil, daha sonra tüm ardıl isimleri bulmaktır. Umarım şimdi biraz anlaşılabilir. – helt

-1

Web üzerinde tatmin edici bir cevap bulamadık, bu yüzden yukarıdaki örnek sağlar, senaryoyu kullanarak

(yeniden adlandırma tarafından yeniden adlandırma) tek tek günlükleri geçmesi için (garip) bir senaryo yazdı ettik follwing çıkışı:

$ git history path/to/File.java

final/package/FinalName.java

benim ~.bashrc senaryoyu eklendi ve benim küresel git yapılandırma

#! /bin/sh 
### Takes a filename as parameter ($1) 
### Echoes all filenames related to $1 
function git_file_history() { 
     loc_var=$1; 
     old="" 
     while [ "$loc_var" != "$old" ] && [ "$loc_var" != "" ] 
     do 
       old=$loc_var; 
       #echo $loc_var; 
       hashes=$(git log --format="%P %H" -1 --follow -- $loc_var); 
       status=$(git diff --name-status --find-renames $hashes | grep $loc_var); 
       awks=`echo $status | awk '{print $3}'` 
       loc_var=$awks; 
     done 
     echo "$loc_var"; 
} 
İlgili konular