2008-12-24 15 views
51

Şu anda SVN'den klonlanmış olan numaralı numaralı bir depom var. Bu depoda Git formunda bazı işler yapıyorum ve bu yapıyı tekrar klonlamaktan nefret ediyorum. Ancak, depoyu orijinal olarak klonladığımda, svn.authors özelliğini (veya semantik olarak benzer bir seçenek) doğru bir şekilde belirtemedim. SVN yazar eşlemelerini, deponun tamamen Git-ified olduğunu şimdi belirtebileceğim bir yol var mı? Tercihen, ham SVN kullanıcı adı yerine Git yazarını temsil etmek için tüm eski yazarları düzeltmek istiyorum.Git SVN ile Retroactively Doğru Yazarlar?

cevap

55
sen temizlemek lazım görerek başlayın

) aynı olması:

Ben yazarların çok sayıda vardı hariç (temelde tarif edildiği şekilde çok fazlaydı Geçenlerde bir large rewrite için kullanılan senaryo
#!/bin/sh 

git filter-branch --env-filter ' 

n=$GIT_AUTHOR_NAME 
m=$GIT_AUTHOR_EMAIL 

case ${GIT_AUTHOR_NAME} in 
     user1) n="User One" ; m="[email protected]" ;; 
     "User Two") n="User Two" ; m="[email protected]" ;; 
esac 

export GIT_AUTHOR_NAME="$n" 
export GIT_AUTHOR_EMAIL="$m" 
export GIT_COMMITTER_NAME="$n" 
export GIT_COMMITTER_EMAIL="$m" 
' 

).

edit Kullanım π Komut dosyasımda bir teklif sorgusu belirtti. Teşekkürler!

+1

GIT_AUTHOR_NAME = "$ n" dışa aktarma yapılmalı veya yalnızca yazarların adının dizinde sonlanacaktır! –

+4

Bu script düzgün çalışıyor. Ancak, uyguladıktan sonra, "git svn rebase" çağrısına yol açan hata iletisine neden oluyor: "Çalışan ağaç geçmişinden gelen SVN bilgisi belirlenemiyor". – olenz

+0

Sonra nasıl düzenlenir ve düzenlenmiş/düzeltilmiş yazarları uzaktan kumandaya geri gönderirsiniz? – user1027169

2

Muhtemelen git-filter-branch, özellikle --commit-filter seçeneğine bakmak isteyebilirsiniz. Bu komut, tüm depo geçmişinizi yeniden yazıp, değiştirmek istediğiniz her şeyi değiştirebilen güçlü bir testere.

Bunu yaptığınızda, her bir işlemin SHA1 karmaları değişmiş olabileceğinden, güncelleştirilmiş depodan yeni klonlar çekmeniz gerektiğini unutmayın. Geçmişin büyük parçalarını yeniden yazmak için

10

git filter-branch kullanılabilir. Bu durumda

, muhtemelen (tamamen denenmemiş) böyle bir şey yapsın:

git filter-branch --env-filter ' 
    GIT_AUTHOR_NAME=`echo "${GIT_AUTHOR_NAME}" | sed -e "s/svnname1/Right Name/; s/svnname2/Correct Name/"` 
    GIT_COMMITTER_NAME=`echo "${GIT_COMMITTER_NAME}" | sed -e "s/svnname1/Right Name/; s/svnname2/Correct Name/"` 
    GIT_AUTHOR_EMAIL=`echo "${GIT_AUTHOR_EMAIL}" | sed -e "s/svnname1/[email protected]/; s/svnname2/[email protected]/"` 
    GIT_COMMITTER_EMAIL=`echo "${GIT_COMMITTER_EMAIL}" | sed -e "s/svnname1/[email protected]/; s/svnname2/[email protected]/"` 
' 

Her zaman olduğu gibi şu geçerlidir: Tarihi yeniden amacıyla, bir conspiracy gerekir. (Tüm yazarlar ve suçların istiyorum varsayarak bu isimlerin her biri için

git shortlog -s 

şöyle bir komut bir giriş oluşturmak:

+0

"Her zaman olduğu gibi, aşağıdakiler geçerlidir: geçmişi yeniden yazmak için bir komploya ihtiyacınız var." Çok güzel söyledi. (Link artık yüklenmiyor olsa da) –

+0

Teşekkürler! Bağlantıları tamir ettim. –

+0

Başka bir svn adının bir alt kümesi olan bir svn adınız varsa, verilen regex'lerle ilgili sorunların üstesinden gelebilirsiniz ... Bu yüzden tanrı bize '^' ve '$' verdi. Değişikliklerden sonra – Dan