it-swarm.asia

Git'in geçmişini yanlış bir e-posta adresini / adını düzeltmek için nasıl düzenlerim

Git kullanmaya başladığımda _ git init ve add ve commit çağrılarına başladı. Şimdi dikkat etmeye başladım ve taahhütlerimin [email protected], istediğim adres yerine. GIT_AUTHOR_EMAIL ve GIT_COMMITTER_EMAIL istediğimi yapacak, ama yine de yanlış e-posta adresi/adı ile eski taahhütleri var. Eski taahhütleri nasıl düzeltebilirim?

76
Chas. Owens

Git filtre dalı için tek bir çağrı ile geri dönüp tüm taahhütlerinizi düzeltebilirsiniz. Bu, rebase ile aynı etkiye sahiptir, ancak her bir işlemi tek tek düzeltmek yerine, tüm geçmişinizi düzeltmek için yalnızca bir komut yapmanız gerekir.

Tüm yanlış e-postaları bu komutla düzeltebilirsiniz:

git filter-branch --env-filter '
    oldname="(old name)"
    oldemail="(old email)"
    newname="(new name)"
    newemail="(new email)"
    [ "$GIT_AUTHOR_EMAIL"="$oldemail" ] && GIT_AUTHOR_EMAIL="$newemail"
    [ "$GIT_COMMITTER_EMAIL"="$oldemail" ] && GIT_COMMITTER_EMAIL="$newemail"
    [ "$GIT_AUTHOR_NAME"="$oldname" ] && GIT_AUTHOR_NAME="$newname"
    [ "$GIT_COMMITTER_NAME"="$oldname" ] && GIT_COMMITTER_NAME="$newname"
    ' HEAD

Daha fazla bilgiyi git docs adresinde bulabilirsiniz.

82
andy

Git'in filtre dalı komutu güçlüdür, ancak önemsiz olmayan herhangi bir şey için, örneğin düzeltmek için birden fazla yazarınız varsa kullanmak korkunç değildir.

İşte yararlı bulduğum, git-shortlog man sayfasında açıklanan .mailmap özelliğini kullanan bir alternatif. Bu, git log'un biçimlendirme özelliğiyle kullanabileceğimiz bir yazar haritalama mekanizması sağlar. Adlandırılmış bir taahhüt dizisini seçmek ve değiştirmek için komutlar oluşturmak için kullanabiliriz.

Örneğin, $ START şubesinden başlayarak $ START taahhüdünden başlayarak yazarlığı düzeltmek istediğinizi varsayalım.

Deponuzun üst dizininde, varolan yazar adlarını düzelttikleriyle eşleyen bir .mailmap dosyası oluşturmanız gerekir. Mevcut yazar adlarının bir listesini aşağıdakilerle alabilirsiniz:

git shortlog -se

Bunun gibi bir .mailmap dosyası bulmanız gerekir (diyelim):

You <[email protected]>   [email protected]
You <[email protected]>   [email protected]

Artık $ BRANCH'ı $ BRANCH2 olarak yeniden yazmak için komutlar oluşturmak üzere git log'un biçimlendirme özelliğini kullanabilirsiniz.

git checkout -b $BRANCH2 $START
git log --reverse --pretty=format:"cherry-pick %H; commit --amend --author='%aN <%aE>' -C %H" $START..$BRANCH | sh - 

İlk komut, $ START komutundan yeni bir boş dal oluşturur. $ START ve sonra $ BRANCH arasındaki her bir taahhüt için, ikinci komut kiraz, orijinal şubeyi geçerli şube $ BRANCH2'nin sonuna kadar seçer ve yazarı doğru şekilde ayarlamasını değiştirir.

Bu genellikle uygulanabilir - bunu ~/.gitconfig dosyanıza koyun:

[alias]
    # git reauthor $START..$END
    reauthor = !sh -c 'eval `git log --reverse --topo-order --pretty=format:\"git cherry-pick %H &&  git commit --amend -C %H --author=\\\"%aN <%aE>\\\" && \" $0 ` "echo success" '

Dolayısıyla, yazarları düzeltmeniz gerektiğinde, şimdi bir .mapfile oluşturmanız ve şunları yapmanız gerekir:

git checkout -b $BRANCH2 $START
git reauthor $START..$BRANCH

Orijinal şube ref yenisine yeniden atanabilir ve yenisi silinebilir:

git checkout $BRANCH
git reset --hard $BRANCH2 # be careful with this command
git branch -d $BRANCH2
28
wu-lee

Cevabı birleştirerek Git'teki ilk işlemde metainformasyonu nasıl düzeltirim?

### Fix the first commit ###    
# create a temporary tag for the root-most commit so we can reference it
git tag root `git rev-list HEAD | tail -1`
# check it out on its own temporary branch
git checkout -b new-root root
# amend the commit
git commit --amend --author "Foo [email protected]"
# (or if you've set the proper git **config** values)
git commit --amend -C HEAD --reset-author
# now you've changed the commit message, so checkout the original branch again
git checkout @{-1}
# and rebase it onto your new root commit
git rebase --onto new-root root
### Fix the rest of the commits ###
git rebase -i root
# edit the file to read "edit <commit number> for each entry
# amend the commit
git commit --amend --author "Foo [email protected]"
# (or if you've set the proper git **config** values)
git commit --amend -C HEAD --reset-author
# move to the next commit
git rebase --continue    
# continue running the last two commands until you see
# Successfully rebased and updated refs/heads/master.
### Clean up ###
# nuke the temporary branch we created
git branch -d new-root
# nuke the temporary tag we created
git tag -d root
9
Chas. Owens

Jedberg'nin cevabını takip etmek için: rebase -i ve söz konusu taahhütleri düzenlemeyi seçin. Eğer kullanırsan git commit --amend --author <AUTHOR DETAILS> ve sonra git rebase continue geçebilir ve geçmişi düzeltebilirsiniz.

5
Chealion