Önceki tüm taahhütlerde adımı ve soyadımı değiştirebilir miyim?


122

Tüm taahhütlerimde adımı, soyadımı ve e-postamı değiştirmek istiyorum, mümkün mü?


2
Sadece sizin için mi, birkaç kişi için mi yoksa büyük bir proje için mi?
thejh



Yanıtlar:


212

Kullanın git-filter-branch.

git filter-branch --commit-filter 'if [ "$GIT_AUTHOR_NAME" = "Josh Lee" ];
  then export GIT_AUTHOR_NAME="Hobo Bob"; export GIT_AUTHOR_EMAIL=hobo@example.com;
  fi; git commit-tree "$@"'

Bu sadece yazarı etkiler, kaydedeni değil (çoğu işlem için yazarla aynı olacaktır). Bunları da yeniden yazmak istiyorsanız, GIT_COMMITTER_NAMEve GIT_COMMITTER_EMAILdeğişkenlerini ayarlayın .

Yeniden yazma geçmişiyle ilgili standart uyarı geçerlidir; bunu yalnızca henüz paylaşılmamış tarihe yapın.

Haziran 2018 Güncellemesi

Kılavuz şimdi --env-filterörneklerinde kullanarak bir çözüm içermektedir : https://git-scm.com/docs/git-filter-branch#_examples :

git filter-branch --env-filter '
    if test "$GIT_AUTHOR_EMAIL" = "root@localhost"
    then
        GIT_AUTHOR_EMAIL=john@example.com
    fi
    if test "$GIT_COMMITTER_EMAIL" = "root@localhost"
    then
        GIT_COMMITTER_EMAIL=john@example.com
    fi
' -- --all

4
Kullanıyorsanız msysgit, hala erişiminiz var bash. Aksi takdirde, hiçbir fikrim yok.
Josh Lee

@Joshua, bash'ın olmadığı bir şey kullanıyorsanız, muhtemelen Windows toplu komut dosyasını kullanabilirsiniz, ancak denemedim.
MatrixFrog

peki ya etiketler? bu çözüm etiketlerin yazarını değiştirmeyecek
piotrek

@Joshua, linux kutusundaki git deposunu kontrol edin ve düzeltmeyi orada gerçekleştirin
Will Sheppard

Yeni şube ve kaynak taahhütlerini olduğu gibi bırakan bir seçenek var mı?
Eugen Konkov

56

Seçilen tüm işlemelerde hem yazarı hem de göndereni yeniden yazmak için:

git filter-branch --commit-filter \
'if [ "$GIT_AUTHOR_NAME" = "OldAuthor Name" ]; then \
export GIT_AUTHOR_NAME="Author Name";\
export GIT_AUTHOR_EMAIL=authorEmail@example.com;\
export GIT_COMMITTER_NAME="Commmiter Name";\
export GIT_COMMITTER_EMAIL=commiterEmail@example.com;\
fi;\
git commit-tree "$@"'

1
Ancak uzak sunucuya değişiklikler nasıl uygulanır?
vikyd

5
@Viky Trygit push --all origin --force
user11153

2
Benim için çalışıyor! GitLab kullanıyorum, push komutundan önce şubenin korumasını kaldırmam gerekiyor.
vikyd

37

Başka yazar yoksa şunları yapabilirsiniz:

git filter-branch --commit-filter 'export GIT_AUTHOR_NAME="authorname"; \
export GIT_AUTHOR_EMAIL=mail@example.com; git commit-tree "$@"'

1
"Kaydedici:" bilgisini yeniden yazmıyor.
user11153

1
Kaydedici bilgilerini yeniden yazmak için tasarlanmamıştır. Bunu yapmak istiyorsanız, GIT_COMMITTER_NAME ve GIT_COMMITTER_EMAIL'i de dışa aktarın (kabul edilen yanıta bakın).
chronospoon

12

Aşağıdaki komut dosyasını örneğin kaydedin ~/.bin/git-replace-authorve şunu kullanarak çalıştırın, örneğin:

git replace-author "John Ssmith" "John Smith" "johnsmith@example.com"

Hiçbir argüman olmadan, mevcut e-posta adresinizi Git yapılandırmasına göre kullanmak için tüm işlemleri adınızla günceller.

DEFAULT_NAME="$(git config user.name)"
DEFAULT_EMAIL="$(git config user.email)"
export OLD_NAME="${1:-$DEFAULT_NAME}"
export NEW_NAME="${2:-$DEFAULT_NAME}"
export NEW_EMAIL="${3:-$DEFAULT_EMAIL}"

echo "Old:" $OLD_NAME "<*>"
echo "New:" "$NEW_NAME <$NEW_EMAIL>"
echo "To undo, use: git reset $(git rev-parse HEAD)"

git filter-branch --env-filter \
'if [ "$GIT_AUTHOR_NAME" = "${OLD_NAME}" ]; then
    export GIT_AUTHOR_NAME="${NEW_NAME}"
    export GIT_AUTHOR_EMAIL="${NEW_EMAIL}"
    export GIT_COMMITTER_NAME="${NEW_NAME}"
    export GIT_COMMITTER_EMAIL="${NEW_EMAIL}"
fi'

Raw (indirmek için)


Kısa bir not olarak: ~/.bin/Kullanıcıların içinde olmalıdır $PATHböylece çalıştırın ve dosya ihtiyaçları çalıştırılabilir olması: chmod +x ~/.bin/git-replace-author.
Michael Gecht

Ve argümanlarla ne işe yarar?
Eugen Konkov

2

Sadece taahhütlerinizi dünyaya itmediyseniz. Diğer bilge herkesin deposunda eski adınız vardır, bu da herkesin adını değiştiremezsiniz.


Doğru, ama bazı durumlarda başka seçeneğin yok. Benim durumumda git yapılandırmamda yapılandırılmış yanlış bir e-posta adresim vardı ("git config --global -l" ile görebildiğim gibi). Sonuç olarak, kendi Github depomda görünen hiçbir taahhüt etkinliğim olmadı (çünkü e-posta adresi Github'da yapılandırılan e-posta ile eşleşmedi)! Bunu çözmek için, stackoverflow.com/a/23564785/2474068 (mükemmel çalıştı) tarifini kullanarak yerel taahhütlerimi düzelttim ve sonra değiştirilen taahhütleri "git push -u -f origin master" (zorla bayrak "-f"). Bu kabul edilen uygulamaya aykırı ama başka seçeneğim yoktu!
leo

1
Evet, demek istediğim, o depodaki herhangi bir çatal, sizin kuvvet itişinizi kabul etmedikçe bu değişikliğe sahip olmayacaktı. Her çatalı güncellemek zor olacaktır :)
EnabrenTane

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.