Git'teki bazı firmaların yazar ve alıcı adlarını ve e-postalarını nasıl değiştirebilirim?

Basit bir okul bilgisayar betiği yazdım ve Git'te değişiklikler yaptım (evde bilgisayarımdan klonlanan pendrive'ımdaki deposunda). Birkaç taahhütten sonra, kök kullanıcı olarak işler yaptığımı anladım.

Bu taahhütlerin yazarını ismimle değiştirmenin bir yolu var mı?

2100
15 апр. Flávio Amieiro tarafından sorulan 15 Nis 2009-04-15 06:09 '09, 06:09 2009-04-15 06:09
@ 32 cevap
  • 1
  • 2

Yazarın (veya yorumcunun) değiştirilmesi, tüm hikayenin yeniden kaydedilmesini gerektirecektir. Bu konuda iyiyseniz ve buna değerseniz, git filter şubesine göz atmalısınız. Manuel sayfa başlamak için birkaç örnek içerir. Ayrıca yazarın adını, yorumcısını, tarihlerini vb. Değiştirmek için ortam değişkenlerini kullanabileceğinizi unutmayın. - git man'ın "Çevre Değişkenleri" bölümüne bakın.

Özellikle, bu komutu kullanarak tüm dallar ve etiketlerin yanlış yazar adlarını ve e-postalarını düzeltebilirsiniz (kaynak: GitHub help ):

887
15 апр. Cevap 15 Nisan tarihinde Pat Notz tarafından verilmiştir. 2009-04-15 06:16 '09, 06:16, 2009-04-15 06:16

Etkileşimli rebases kullanma

Yapabilirsin

 git rebase -i -p <some HEAD before all of your bad commits> 

Sonra tüm kötü taahhütlerinizi rebase dosyasında "düzenleme" olarak işaretleyin. Ayrıca, ilk taahhüdünüzü de değiştirmek istiyorsanız, yeniden dosyalama dosyasındaki ilk satıra manuel olarak eklemeniz gerekir (diğer satırların formatını izleyin). Sonra git, her bir taahhüdünüzü değiştirmenizi istediğinde

 git commit --amend --author "New Author Name <email@address.com>" --no-edit  \ git rebase --continue 

Tek sabitleme

Bazı yorumcuların belirttiği gibi, yalnızca son taahhüdünü değiştirmek istiyorsanız, yeniden düzenleme komutuna gerek yoktur. Sadece yap

  git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author 

Birleşme taahhütleri hakkında not

İlk tepkimde küçük bir kusur vardı. Geçerli HEAD ile <some HEAD before all your bad commits> arasında bir birleşme varsa, git rebase bunları git rebase (ve bu arada, GitHub sorgularını geçmişinizde kullanıyorsanız). Bu, çok sık farklı bir hikayeye yol açabilir (çünkü yinelenen değişiklikler "yeniden kurulabilir") ve en kötü durumda, bu durum git rebase yeniden bir araya gelip karmaşık birleştirme çatışmalarını çözmenizi isteyecektir (muhtemelen birleştiğinde çözüldü). ). Çözüm, hikayenizin birleştirme yapısını koruyacak olan git rebase için -p bayrağını kullanmaktır. git rebase , -p ve -i git rebase kullanmanın sorunlara yol açabileceği konusunda uyarıyor, ancak BUGS bölümünde şöyle yazıyor: "Taahhütleri düzenlemek ve taahhüt mesajlarını yeniden yazmak iyi sonuç vermeli" diyor.

Yukarıdaki komutu -p ekledim. Sadece son mesajı değiştirdiğinizde, bu bir problem değil.

1465
24 авг. cevap asmeurer 24 Ağustos verilen . 2009-08-24 06:08 '09, 06:08, 2009-08-24 06:08

Ayrıca şunları da yapabilirsiniz:

 git filter-branch --commit-filter " if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ]; then GIT_COMMITTER_NAME="<New Name>"; GIT_AUTHOR_NAME="<New Name>"; GIT_COMMITTER_EMAIL="<New Email>"; GIT_AUTHOR_EMAIL="<New Email>"; git commit-tree "$@"; else git commit-tree "$@"; fi" HEAD 
573
15 мая '09 в 22:15 2009-05-15 22:15 Cevap 15 Mayıs, 09:15 de 09:15 de Rognon tarafından verildi. 2009-05-15 22:15

Bir ekleme, ancak çok kullanıcılı bir deponuz varsa dikkatli olun; bu, aynı (yeni) yazar ve yorumcunun varlığı için tüm düzeltmeleri değiştirir.

 git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='new@email'; GIT_COMMITTER_NAME='Newname'; GIT_COMMITTER_EMAIL='new@email';" HEAD 

Satırlardan satırlara (bash'ta mümkündür):

501
15 апр. Cevap 15 Nis tarihinde Brian Gianforcaro tarafından yapılmıştır . 2009-04-15 06:22 '09, 06:22, 2009-04-15 06:22

Bu, $ HOME / .gitconfig öğesini başlatmadığınızda gerçekleşir. Bunu şu şekilde düzeltebilirsiniz:

 git config --global user.name "you name" git config --global user.email you@domain.com git commit --amend --reset-author 

git sürümü 1.7.5.4 ile

209
16 февр. Cevap 16 Şubat'ta lrkwz verildi. 2012-02-16 12:46 '12 12:46 2012-02-16 12:46

Bir düzeltme için:

181
27 апр. cevap blueyed 27 nisan verilir . 2010-04-27 01:50 '10, 1:50 2010-04-27 01:50

Yalnızca en küçük --amend kötü yazarları olması durumunda, exec komutunu kullanarak ve --amend komutunu kullanarak git rebase -i içinde hepsini yapabilirsiniz:

 git rebase -i HEAD~6 # as required 

Düzenlenebilir bir taahhüt listesi sunar:

 pick abcd Someone else commit pick defg my bad commit 1 pick 1234 my bad commit 2 

Sonra exec ... --author="..." yazarlar exec ... --author="..." kötü yazarların bulunduğu tüm satırlardan sonra:

 pick abcd Someone else commit pick defg my bad commit 1 exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD pick 1234 my bad commit 2 exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD 

editörden kaydedip çıkın (çalıştırmak için).

Bu karar diğerlerinden daha uzun olabilir, ancak çok kontrol edilebilir - Ne yaptığını tam olarak biliyorum.

@Asmeurer'a ilham için teşekkürler.

159
08 дек. Cevap Alex Brown 08 Aralık tarafından verilmiştir . 2011-12-08 20:05 '11 20: 05'te 2011-12-08 20:05

Github aşağıdaki kabuk betiği olan hoş bir çözüme sahiptir:

108
07 окт. Cevap Olivier Verdier tarafından yapıldı 07 Eki 2010-10-07 12:54 '10 12:54 2010-10-07 12:54

Yukarıda da belirtildiği gibi, tarihi yeniden yazmak tehlikelidir ve diğer insanların depolarını tahrip eder.

Ancak bunu gerçekten yapmak istiyorsanız ve bash ortamındaysanız (Linux'ta sorun değil, Windows'ta git yüklemesiyle birlikte gelen git bash'ı kullanabilirsiniz), git filter şubesini kullanın:

 git filter-branch --env-filter ' if [ $GIT_AUTHOR_EMAIL = bad@email ]; then GIT_AUTHOR_EMAIL=correct@email; fi; export GIT_AUTHOR_EMAIL' HEAD~20..HEAD 
80
04 авг. Cevap svick 04 ağustos tarafından verilmiştir . 2010-08-04 03:52 '10, 03:52 2010-08-04 03:52

Başka bir yazardan hazırlıksız bir taahhüt alırken, bununla baş etmenin kolay bir yolu vardır.

git commit --amend --reset-author

46
24 марта '16 в 1:23 2016-03-24 01:23 Cevap Ryanmt tarafından 24 Mart'ta 16: 1'de 23:23 2016-03-24 01:23 tarihinde verilir.

Bu @Brian versiyonunun daha düşünceli bir versiyonudur:

Yazar ve yorumcuyu değiştirmek için bunu yapabilirsiniz (bash'ta mümkün olan bir dizgideki satırları kullanarak):

 git filter-branch --force --env-filter ' if [ "$GIT_COMMITTER_NAME" = "<Old name>" ]; then GIT_COMMITTER_NAME="<New name>"; GIT_COMMITTER_EMAIL="<New email>"; GIT_AUTHOR_NAME="<New name>"; GIT_AUTHOR_EMAIL="<New email>"; fi' -- --all 

Seçeneğin hafif bir açıklaması -- --all hepsi gerekli olabilir: tüm bağlantılar üzerindeki tüm revizyonlarda (tüm şubeler dahil) filtre ile birlikte çalışır. Bu, örneğin, etiketlerin yeniden yazıldığı ve yeniden yazılan dallarda görülebildiği anlamına gelir.

Yaygın bir “hata”, HEAD kullanmaktır; bu, yalnızca geçerli şube için tüm revizyonları filtrelemek anlamına gelir. Ve sonra yeniden yazılmış konu içinde etiket (veya diğer bağlantılar) olmayacak.

38
09 дек. cevap 09 stigkj verilir . 2011-12-09 13:23 '11, 13:23 2011-12-09 13:23

Bunu takma ad olarak kullanabilirsiniz , böylece:

 git change-commits GIT_AUTHOR_NAME "old name" "new name" 

veya son 10 taahhüt için:

 git change-commits GIT_AUTHOR_EMAIL "old@email.com" "new@email.com" HEAD~10..HEAD 

~ / .Gitconfig dosyasına ekleyin:

 [alias] change-commits = "!f() { VAR=$1; OLD=$2; NEW=$3; shift 3; git filter-branch --env-filter \"if [[ \\\"$'echo $VAR'\\\" = '$OLD' ]]; then export $VAR='$NEW'; fi\" $@; }; f " 

Kaynak: https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig

Umarım bu yardımcı olur.

38
02 авг. Cevap Brauliobo 02 Ağustos verilmiştir . 2012-08-02 02:09 '12, 02:09 2012-08-02 02:09
  • git rebase -i <sha1 or ref of starting point>
  • düzenlemek istediğiniz tüm taahhütleri düzenleme ile işaretleyin (veya e )
  • Taahhütleri yerine getirene kadar aşağıdaki iki komutu yerine getiriniz:

    git commit --amend --reuse-message=HEAD --author="New Author <new@author.email>" ; git rebase --continue

Bu, diğer tüm taahhüt bilgilerini kaydedecektir (tarihler dahil). --reuse-message=HEAD , mesaj düzenleyicinin başlatılmasını devre dışı bırakır.

23
04 окт. cevap sporsh 04 ekim verilir . 2012-10-04 05:22 '12 5:22, 2012-10-04 05:22

Etiketleri ve tüm dalları içeren tüm depo yazarını yeniden yazmak için aşağıdakileri kullanırım:

filtre bölümünün MAN sayfasında açıklandığı gibi, filter-branch yedekleri altında yapılan tüm orijinal referansları silin (bu yıkıcı, ilk yedekleme): 

21
16 февр. Cevap Ton van den Heuvel'e 16 Şubat'ta verildi. 2011-02-16 18:27 '11 18:27 2011-02-16 18:27

Basit bir author-conv-file çalışan bu çözümü uyarladım (format git-cvsimport ile aynı). Tüm şubelerin author-conv-file tanımlandığı şekilde tüm kullanıcıları değiştirerek çalışır.

cvs2git aktarmak için bunu cvs2git ile birlikte cvs2git .

budur. Örnek author-conv-file

 john=John Doe <john.doe@hotmail.com> jill=Jill Doe <jill.doe@hotmail.com> 

komut:

20
05 февр. Leif Gruenwoldt 05 Şubat tarafından verilen cevap 2011-02-05 01:46 '11, 1:46 2011-02-05 01:46

Agresif yolun sunulan versiyonlarını özellikle buldum, özellikle diğer geliştiricilerden düzeltmeler yaparsanız, bu esasen kendi kodlarını çalar.

Aşağıdaki sürüm tüm şubelerde çalışır ve bunu önlemek için yazarı ve işletmeciyi ayrı ayrı değiştirir.

Tüm seçenekler için leif81 talep ediyor.

18
23 апр. Cevap verilen drahnr 23 Nis 2012-04-23 11:46 '12 11:46 2012-04-23 11:46
  • author name email Amend değiştirin, ardından old-commit with new-one yenisini değiştirin:

     $ git checkout <commit-hash> # checkout to the commit need to modify $ git commit --amend --author "name <author@email.com>" # change the author name and email $ git replace <old-commit-hash> <new-commit-hash> # replace the old commit by new one $ git filter-branch -- --all # rewrite all futures commits based on the replacement $ git replace -d <old-commit-hash> # remove the replacement for cleanliness $ git push -f origin HEAD # force push 
  • Rebasing başka bir yolu:

     $ git rebase -i <good-commit-hash> # back to last good commit # Editor would open, replace 'pick' with 'edit' before the commit want to change author $ git commit --amend --author="author name <author@email.com>" # change the author name  email # Save changes and exit the editor $ git rebase --continue # finish the rebase 
17
14 дек. Sajib Khan 14 Aralık'ta cevap verdi. 2016-12-14 18:01 '16 6:01 PM 2016-12-14 18:01

Şunu söylemeliyim ki, tek sorun yazar / e-postanın normalden farklı olması durumunda, bu bir sorun değildir. Doğru düzeltme, temel dizinde .mailmap adında bir dosya oluşturmak ve bu gibi satırları içerir.

 Name you want <email you want> Name you don't want <email you don't want> 

Şu andan itibaren, git shortlog gibi komutlar bu iki ismi aynı görecek (özellikle söylemediğiniz sürece). Detaylar için http://schacon.github.com/git/git-shortlog.html adresine bakınız.

Bu, burada tüm diğer çözümlerin avantajına sahiptir, geçmişi yeniden yazmanıza gerek yoktur; bu durum bir akış yukarıdayken sorunlara neden olabilir ve her zaman yanlışlıkla veri kaybetmek için iyi bir yoldur.

Elbette, kendin gibi bir şey yaptıysan ve gerçekten başka biri olmalı ve şu an için hikayeyi yeniden yazmayı aklına getirmezsen, düzeltmenin yazarını değiştirmek, atfetme amaçları için muhtemelen iyi bir fikirdir (bu durumda seni gönderiyorum benim diğer cevabım burada).

15
29 февр. Cevap 29 Şubat’ta asistan olarak verildi . 2012-02-29 02:57 '12, 02:57 2012-02-29 02:57

Bu havuzun tek kullanıcısıysanız, git filter-branch ( svick'in yazdığı gibi ) veya git fast-export / git fast-import plus script filtresini ( docgnome yanıtı tarafından belirtilen makalede açıklandığı gibi) kullanarak yeniden yazabilirsiniz. veya etkileşimli rebase . Ancak bunlardan herhangi biri ilk değiştirilen taahhütten gelen değişiklikleri değiştirir; Bu, değişikliklerini tekrar yazmadan önce şubesine dayanan herkes için zorluk demektir.

KURTARMA

Diğer geliştiriciler çalışmalarını yayın öncesi sürümüne dayanmazsa, en kolay çözüm yeniden klonlamak (yeniden klonlamak) olur.

Alternatif olarak, deposunda herhangi bir değişiklik olmazsa hızlı bir şekilde git rebase --pull olan git rebase --pull deneyebilirler veya şubelerini yeniden yazılan taahhütler üzerinden yeniden bağlayabilirler (birleşmeden kaçınmak istiyoruz, çünkü revizyon öncesi sonsuza kadar devam edecektir). Tüm bunlar işlerinin olmadığını gösteriyor; Aksi takdirde değişiklikleri silmek için git stash kullanın.

Diğer geliştiriciler işlev dalları kullanıyorsa ve / veya git pull --rebase çalışmıyor. yukarı akış yapılandırılmadığından, yeniden yazmadan sonra çalışmalarını kayıtların üstüne yeniden almak zorunda kalırlar. Örneğin, yeni değişiklikler aldıktan sonra ( git fetch ), origin/master temelli / çatalına dayalı master dal için çalıştırmanız gerekir

 $ git rebase --onto origin/master origin/master@{1} master 

Burada, origin/master@{1} ön kayıt durumudur ( alımdan önce), gitrevisions .


Alternatif bir çözüm, 1.6.5 sürümünden beri Git'te mevcut olan refs / replace / mekanizmasını kullanmak olabilir. Bu çözümde, yanlış e-posta adresiyle yapılan taahhütler için değişiklik sağlarsınız; o zaman "ref" alan birileri ( fetch = +refs/replace/*:refs/replace/* gibi bir şey) fetch = +refs/replace/*:refs/replace/* refspec, .git/config içinde uygun bir yerde) yerine geçenleri şeffaf bir şekilde alacaklardır. bu bağlantıları almazsa eski taahhütleri göreceksiniz.

İşlem şöyle gözüküyor:

  • Yanlış bir e-posta adresiyle tüm taahhütleri bulun, örneğin

     $ git log --author=user@wrong.email --all 
  • Her yanlış işlem için, yerine kullanılacak bir işlem oluşturun ve bunu nesne veritabanına ekleyin.

     $ git cat-file -p <ID of wrong commit> | sed -e 's/user@wrong\.email/user@example.com/g' > tmp.txt $ git hash-object -t commit -w tmp.txt <ID of corrected commit> 
  • Artık nesne veritabanındaki taahhüdü düzelttikten sonra Git'e yanlış değiştirme işlemini otomatik olarak ve saydam olarak değiştirmesini söylemelisiniz: git replace change ile düzeltildi:

     $ git replace <ID of wrong commit> <ID of corrected commit> 
  • Son olarak, bu prosedürün gerçekleştirilip gerçekleştirilmediğini kontrol etmek için değişimin tamamını listeleyin.

     $ git replace -l 

    ve yenisi olup olmadığını kontrol edin

     $ git log --author=user@wrong.email --all 

Elbette, bu işlemi otomatik hale getirebilirsiniz ... iyi, git replace kullanımı (şimdiye kadar) toplu iş modu olmayan her şey için, yani bunun için bir kabuk halkası kullanmanız veya manuel olarak değiştirmeniz gerekir.

SABİT DEĞİL! YMMV.

refs/replace/ mekanizmasını kullanırken bazı pürüzlü köşelerle karşılaşabileceğinizi unutmayın: yeni ve henüz iyi test edilmemiş .

9
04 авг. Cevap Jakub Narębski 04 Ağustos tarafından verilen cevap . 2010-08-04 12:41 '10 12:41 2010-08-04 12:41

Düzeltmek istediğiniz düzeltmeler en sonuncuysa ve bunlardan yalnızca birkaçıysa, doğru adı ve e-postayı ayarladıktan sonra düzeltmeye geri dönmek için git reset ve git stash kombinasyonunu kullanabilirsiniz.

Sıralama şöyle bir şey olacak (2 yanlış taahhüt için, değişiklikleri beklemeden):

 git config user.name <good name> git config user.email <good email> git reset HEAD^ git stash git reset HEAD^ git commit -a git stash pop git commit -a 
6
30 сент. Tarafından verilen cevap djromero 30 Eyl 2011-09-30 21:04 '11 21:04 2011-09-30 21:04

Etkileşimli rebase kullanarak, değiştirmek istediğiniz her işlemden sonra bir değişiklik komutu verebilirsiniz. Örneğin:

 pick a07cb86 Project tile template with full details and styling x git commit --amend --reset-author -Chead 
5
26 февр. Cevap 26 Şubat'ta verilir. 2013-02-26 16:19 '13 16:19 2013-02-26 16:19

Git'in biri müşteri için (değişikliği yapan kişi) diğeri yazar için (değişikliği yazan kişi) iki farklı e-posta adresi sakladığını unutmayın.

git log -1 --format=%cn,%ce hakkındaki bilgiler çoğu yerde gösterilmez, ancak git log -1 --format=%cn,%ce (veya belirli bir işlemi belirtmek için log yerine show kullanın).

Son taahhüdünüzün yazarını değiştirmek git commit --amend --author "Author Name <email@example.com>" kadar kolaydır, üye bilgilerinde aynısını yapmak için tek bir satır veya tartışma yoktur.

Çözüm, kullanıcı bilgilerinizi değiştirmek ve ardından işletmeciyi mevcut bilgilerinize güncelleyen taahhüdün düzeltilmesidir (geçici olarak ya da değil):

 git config user.email my_other_email@example.com git commit --amend 
5
06 дек. Tarafından cevap Sir Sir Athos 06 2013-12-06 00:21 '13, 0:21 2013-12-06 00:21

Eğer EGit ile Eclipse kullanıyorsanız, oldukça basit bir çözüm var.
Varsayım: local_master_user_x yerel dalında, geçersiz bir kullanıcı nedeniyle uzak dalın "ana" na aktarılamayan bir hata yaptınız.

  • Uzak şubeye "master" göz atın
  • Local_master_user_x'in içerdiği projeleri / klasörleri / dosyaları seçin.
  • Sağ tıklayın - İle Değiştir - Şube - 'local_master_user_x'
  • Bu değişiklikleri, bu kez doğru kullanıcı olarak ve "master" yerel şubesinde tekrar tamamlayın.
  • Uzaktaki 'master' düğmesine bas
5
24 авг. Cevap Paphko 24 Ağustos tarafından verilir . 2011-08-24 20:54 '11 20:54 2011-08-24 20:54

Bugün, yazarın adındaki UTF8 karakteri derleme sunucusunda sorunlara neden olduğunda bir sorunla karşılaştık, bu nedenle düzeltmek için geçmişi yeniden yazmak zorunda kaldık. Aşağıdaki adımlar atıldı:

Adım 1: Git kullanıcı adınızı, buradaki talimatlara göre gelecek tüm taahhütlerinizle değiştirin: https://help.github.com/articles/setting-your-username-in-git/

Adım 2. Aşağıdaki bash betiğini çalıştırın:

 #!/bin/sh REPO_URL=ssh://path/to/your.git REPO_DIR=rewrite.tmp # Clone the repository git clone ${REPO_URL} ${REPO_DIR} # Change to the cloned repository cd ${REPO_DIR} # Checkout all the remote branches as local tracking branches git branch --list -r origin/* | cut -c10- | xargs -n1 git checkout # Rewrite the history, use a system that will preseve the eol (or lack of in commit messages) - preferably Linux not OSX git filter-branch --env-filter ' OLD_EMAIL="me@something.com" CORRECT_NAME="New Me" if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ] then export GIT_COMMITTER_NAME="$CORRECT_NAME" fi if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ] then export GIT_AUTHOR_NAME="$CORRECT_NAME" fi ' --tag-name-filter cat -- --branches --tags # Force push the rewritten branches + tags to the remote git push -f # Remove all knowledge that we did something rm -rf ${REPO_DIR} # Tell your colleagues to `git pull --rebase` on all their local remote tracking branches 

Kısa bir genel bakış. Geçici bir dosyaya sipariş verin, silinen tüm şubeleri kontrol edin, hikayeyi yeniden yazacak bir komut dosyası çalıştırın, yeni bir durum oluşturun ve tüm çalışma arkadaşlarınıza nasıl değişiklik alacağınızı söyleyin.

OS X'te çalıştırmakta sorun yaşadık, çünkü bir şekilde işlem mesajlarındaki satır sonunu karıştırdı, bundan sonra Linux makinesinde yeniden başlatmak zorunda kaldık.

5
ответ дан Miloš Ranđelović 22 окт. '14 в 6:32 2014-10-22 06:32

Ваша проблема очень распространена. См. " Использование Mailmap для исправления списка авторов в Git "

Для простоты я создал script, чтобы облегчить процесс: git-changemail