web-dev-qa-db-ja.com

gitの履歴を編集して間違ったメールアドレス/名前を修正するには

Gitを使い始めたときは、git initを実行し、addcommitの呼び出しを開始しました。今、私は注意を払い始めており、私のコミットが目的のアドレスではなくcowens@localmachineとして表示されていることがわかります。 GIT_AUTHOR_EMAILGIT_COMMITTER_EMAILを設定すると期待どおりの結果が得られるように見えますが、古いコミットが間違ったメールアドレス/名前で残っています。古いコミットを修正するにはどうすればよいですか?

76
Chas. Owens

Git filter-branchを1回呼び出すだけで、戻ってすべてのコミットを修正できます。これはリベースと同じ効果がありますが、各コミットを個別に修正するのではなく、1つのコマンドを実行するだけですべての履歴を修正できます。

次のコマンドを使用して、すべての間違ったメールを修正できます。

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

詳細は git docs から入手できます。

82
andy

Gitのfilter-branchコマンドは強力ですが、たとえば、複数の作成者が修正する場合など、重要なものに使用するのは恐ろしく扱いにくいです。

Git-shortlogのマンページに記載されている.mailmap機能を使用する、便利な代替案を次に示します。これは、git logのフォーマット機能で使用できる著者マッピングメカニズムを提供します。これを使用して、コミットの名前付きシーケンスを選択および修正するコマンドを生成できます。

たとえば、コミット$ STARTから始まるブランチ$ BRANCHの作成者を修正するとします。

既存の作者名を正しい作者にマッピングする.mailmapファイルをリポジトリの最上位ディレクトリに作成する必要があります。既存の著者名のリストは次のようにして取得できます。

git shortlog -se

次のような.mailmapファイルを作成する必要があります(たとえば)。

You <[email protected]>   cowens@localmachine
You <[email protected]>   root@localmachine

これで、git logのフォーマット機能を使用して、$ BRANCHを$ BRANCH2として書き換えるコマンドを生成できます。

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

最初のコマンドは、コミット$ STARTから発生する新しい空のブランチを作成します。 $ STARTと$ BRANCHの終わりの間のコミットごとに、2番目のコマンドcherryは、元のコミットを現在のブランチ$ BRANCH2の終わりまで選択し、それを修正して作成者を正しく設定します。

これは一般的にも当てはまります-これを〜/ .gitconfigに入れてください:

[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" '

したがって、作成者を修正する必要がある場合は、.mapfileを生成して次のようにする必要があります。

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

元のブランチ参照を新しいブランチ参照に再割り当てし、新しいブランチ参照を削除できます。

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

からの答えを組み合わせる gitの最初のコミットでメタ情報を修正するにはどうすればよいですか?

### 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の回答をフォローするには:rebase -iを使用して、問題のコミットの編集を選択できます。 git commit --amend --author <AUTHOR DETAILS>を使用してからgit rebase continueを使用すると、履歴を確認して修正できます。

5
Chealion