web-dev-qa-db-ja.com

特定のコミットのためにコミット作成者を変更するにはどうすればいいですか?

歴史の中のある特定のコミットの作者を変更したいのです。それは最後のコミットではありません。

私はこの質問について知っています - Gitでコミットの作者を変更するにはどうすればいいですか?

しかし、私は何かを考えています、そこで私はハッシュまたはショートハッシュによってコミットを識別します。

1705
MicTech

変更が必要なコミットよりも前の履歴から対話式にリベースします(git rebase -i <earliercommit>)。リベースされているコミットのリストで、変更したいコミットのハッシュの横にあるテキストをpickからeditに変更します。それからgitがコミットを変更するように促したら、これを使います:

git commit --amend --author="Author Name <[email protected]>"

たとえば、コミット履歴がFHEADとしてA-B-C-D-E-Fで、CDの作成者を変更したい場合は、.

  1. git rebase -i Bを指定します( これは、git rebase -i Bコマンドの実行後に表示される例です
    • Aを編集する必要がある場合はgit rebase -i --rootを使用してください。
  2. CDの両方の行をpickからeditに変更します。
  3. リベースが開始されると、最初にCで一時停止します。
  4. git commit --amend --author="Author Name <[email protected]>"になります
  5. それでgit rebase --continue
  6. Dで再び一時停止します
  7. それからあなたは再びgit commit --amend --author="Author Name <[email protected]>"でしょう
  8. git rebase --continue
  9. リベースは完了します。
  10. 更新したコミットでOriginを更新するにはgit Push -fを使います。
2899
Amber

この質問に対する 受け入れられた答え )はインタラクティブなリベースの素晴らしく賢い使用法ですが、作成者を変更しようとしているコミットがその後マージされたブランチにある場合、残念ながらそれは矛盾を示します。乱雑な履歴を処理するときは機能しません。

Gitの履歴を書き換えるために環境変数の設定と設定解除に依存するスクリプトを実行することに不安を感じているので、 this post と類似した this answer がより完成した)に基づいて新しい答えを書きます。

以下はリンクされた答えとは異なり、テスト済みで動作しています。説明を明確にするために、03f482d6は作成者が置き換えようとしているコミットであり、42627abeは新しい作成者とのコミットであるとします。

  1. 変更しようとしているコミットをチェックアウトしてください。

    git checkout 03f482d6
    
  2. 作者を変更します。

    git commit --amend --author "New Author Name <New Author Email>"
    

    これで、ハッシュを42627abeと仮定した新しいコミットができました。

  3. 元のブランチをチェックしてください。

  4. 古いコミットを新しいものとローカルに置き換えます。

    git replace 03f482d6 42627abe
    
  5. 置き換えに基づいて将来のコミットをすべて書き換えます。

    git filter-branch -- --all
    
  6. 清潔にするために交換部品を取り外します。

    git replace -d 03f482d6
    
  7. 新しい履歴をプッシュします(以下が失敗した場合、 - git logおよび/またはgit diffによる健全性チェックの後にのみ--forceを使用してください)。

    git Push --force-with-lease
    

4-6の代わりに新しいコミットにリベースすることができます。

git rebase -i 42627abe
402
merlin2011

Githubドキュメンテーションは ブランチのすべてのコミットのためのコミッター情報を置き換えるスクリプト - を含んでいます

#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="[email protected]"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="[email protected]"

if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
    export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
    export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
168
olivieradam666
  • メールをグローバルに設定にリセットします。

    git config --global user.email [email protected]

  • 編集を必要とせずにコミットの作者をリセットします。

    git commit --amend --reset-author --no-edit

97
pravbeatle

以下のコマンドを使って、最後のコミットの作成者を変更することができます。

git commit --amend --author="Author Name <[email protected]>"

ただし、複数のコミットされた作者名を変更したい場合は、少し注意が必要です。対話的なリベースを開始してからコミットを編集としてマークし、それらを1つずつ修正して終了する必要があります。

git rebase -iでリベースを開始してください。それはあなたにこのような何かを見せるでしょう。

https://monosnap.com/file/G7sdn66k7JWpT91uiOUAQWMhPrMQVT.png

作成者名を変更したいコミットのpickキーワードをeditに変更します。

https://monosnap.com/file/dsq0AfopQMVskBNknz6GZZwlWGVwWU.png

それからエディタを閉じます。初心者の場合は、Escapeを押してから:wqを入力し、Enterを押します。

それから何も起こらなかったようにあなたはあなたの端末を見るでしょう。実際、あなたは対話型のリベースの最中です。それでは上記のコマンドを使ってコミットの作者名を修正しましょう。再びエディタが開きます。 git rebase --continueで終了して、リベースを続けてください。編集したいコミット数についても同じことを繰り返します。 No rebase in progress?メッセージが表示されたら、対話式リベースが終了したことを確認できます。

74
Fatih

あなたがリンクした質問の中の答えは良い答えであり、あなたの状況をカバーします(他の質問はそれが複数のコミットを書き直すことを含むのでより一般的です)。

git filter-branchを試すための言い訳として、私は与えられたコミットのためにAuthor NameやAuthor Emailを書き換えるスクリプトを書きました:

#!/bin/sh

#
# Change the author name and/or email of a single commit.
#
# change-author [-f] commit-to-change [branch-to-rewrite [new-name [new-email]]]
#
#     If -f is supplied it is passed to "git filter-branch".
#
#     If <branch-to-rewrite> is not provided or is empty HEAD will be used.
#     Use "--all" or a space separated list (e.g. "master next") to rewrite
#     multiple branches.
#
#     If <new-name> (or <new-email>) is not provided or is empty, the normal
#     user.name (user.email) Git configuration value will be used.
#

force=''
if test "x$1" = "x-f"; then
    force='-f'
    shift
fi

die() {
    printf '%s\n' "$@"
    exit 128
}
targ="$(git rev-parse --verify "$1" 2>/dev/null)" || die "$1 is not a commit"
br="${2:-HEAD}"

TARG_COMMIT="$targ"
TARG_NAME="${3-}"
TARG_EMAIL="${4-}"
export TARG_COMMIT TARG_NAME TARG_EMAIL

filt='

    if test "$GIT_COMMIT" = "$TARG_COMMIT"; then
        if test -n "$TARG_EMAIL"; then
            GIT_AUTHOR_EMAIL="$TARG_EMAIL"
            export GIT_AUTHOR_EMAIL
        else
            unset GIT_AUTHOR_EMAIL
        fi
        if test -n "$TARG_NAME"; then
            GIT_AUTHOR_NAME="$TARG_NAME"
            export GIT_AUTHOR_NAME
        else
            unset GIT_AUTHOR_NAME
        fi
    fi

'

git filter-branch $force --env-filter "$filt" -- $br
48
Chris Johnsen

前にコミット:

enter image description here

すべてのコミットに対して作者を修正するには、@ Amberの回答からコマンドを適用します。

git commit --amend --author="Author Name <[email protected]>"

あるいはあなたの名前とEメールを再利用するためにあなたはただ書くことができます:

git commit --amend --author=Eugen

コマンドの後にコミットします。

enter image description here

たとえば、4025621から始まるすべてを変更するには、次のようにします。

enter image description here

あなたが実行する必要があります:

git rebase --onto 4025621 --exec "git commit --amend --author=Eugen" 4025621

注:名前や電子メールアドレスなどのスペースを含む作成者を含めるには、作成者をエスケープ引用符で囲む必要があります。例えば、次のとおりです。

git rebase --onto 4025621 --exec "git commit --amend --author=\"Foo Bar <[email protected]>\"" 4025621

または、このエイリアスを~/.gitconfigに追加します。

[alias]
    reauthor = !bash -c 'git rebase --onto $1 --exec \"git commit --amend --author=$2\" $1' --

そして実行します。

git reauthor 4025621 Eugen
22
Eugen Konkov

Amber's answer に追加のステップが1つあります。集中型リポジトリを使用している場合:

中央リポジトリの更新を強制するためのgit Push -f

一貫性が損なわれる可能性があるため、同じブランチに取り組んでいる人が多くないように注意してください。

12
Fabian76

git rebase -iをするとき、docにこの興味深いビットがあります:

2つ以上のコミットを1つにまとめる場合は、2回目以降のコミットのコマンド"pick""squash"または"fixup"に置き換えます。コミットの作者が異なる場合、折り畳まれたコミットは最初のコミットの作者に起因します。折り畳みコミットに対して推奨されるコミットメッセージは、最初のコミットのコミットメッセージと"squash"コマンドによるコミットメッセージの連結ですが、"fixup"コマンドによるコミットのコミットメッセージは省略します。

  • A-B-C-D-E-Fの履歴がある場合は、
  • そして、コミットBD(= 2コミット)を変更したいとします。

それからあなたはすることができます:

  • git config user.name "Correct new name"
  • git config user.email "[email protected]"
  • 空のコミットを作成します(コミットごとに1つ):
    • あなたはリベースの目的でメッセージが必要です
    • git commit --allow-empty -m "empty"
  • リベース操作を開始します
    • git rebase -i B^
    • B^Bの親を選択します。
  • 空のコミットを - の前に 各コミットを変更したいと思うでしょう
  • そのためにはpicksquashに変更します。

git rebase -i B^があなたにくれるものの例:

pick sha-commit-B some message
pick sha-commit-C some message
pick sha-commit-D some message
pick sha-commit-E some message
pick sha-commit-F some message
# pick sha-commit-empty1 empty
# pick sha-commit-empty2 empty

それをに変更します。

# change commit B's author
pick sha-commit-empty1 empty
squash sha-commit-B some message
# leave commit C alone
pick sha-commit-C some message
# change commit D's author
pick sha-commit-empty2 empty
squash sha-commit-D some message
# leave commit E-F alone
pick sha-commit-E some message
pick sha-commit-F some message

メッセージを編集するように促されます。

# This is a combination of 2 commits.
# The first commit's message is:

empty

# This is the 2nd commit message:

...some useful commit message there...

そして最初の数行を削除するだけです。

12
dnozay

変更するコミットが最後のコミットでない場合は、次の手順に従います。コミットが別のブランチにある場合、最初にそのブランチに切り替えます。

git checkout branch_name

変更するコミットの前にコミットを見つけ、そのハッシュを見つけます。次に、rebaseコマンドを発行します。

git rebase -i -pコミットのハッシュ

次に、エディターが開き、変更するコミットの「編集」を入力します。他のデフォルトの「選択」オプションのままにします。変更したら「esc」キーとwqを入力してください!出る。

次に、修正オプションを指定してgit commitコマンドを発行します。

git commit --amend --author = "ユーザー名メール" --no-edit

次に、次のコマンドを発行します。

git rebase --continue

コミットの作成者がローカルリポジトリで更新されたら、変更をリモートリポジトリにプッシュします。

1
ChannaB

変更する必要があるのがAUTHOR OF THE LASTコミットで、他に自分のリポジトリを使用していない場合は、最後のコミットを元に戻すことができます。

git Push -f Origin last_commit_hash:branch_name 

あなたのコミットの作者名を次のように変更してください。

git commit --amend --author "type new author here"

開いたエディタを終了して、コードをもう一度プッシュします。

git Push
0
pebox11

Eugen Konkov responseを促進するために、rootコミットから始めるには、--rootフラグを使用してください。 --no-editフラグも役に立ちます

git rebase --onto <sha> --exec "git commit --amend --author='name <email>' --no-edit" --root
0
korwalskiy

コミットをプッシュした後に作成者名を変更する手順

  1. 最初に「git log」と入力して、コミットIDと詳細を取得します
  2. git rebase i HEAD〜10(10はrebaseに表示するコミットの合計です)

    If you Get anything like below

    fatal: It seems that there is already a rebase-merge directory, and I wonder if you are in the middle of another rebase. If that is the case, please try

    git rebase (--continue | --abort | --skip)If that is not the case, please rm -fr ".git/rebase-merge" and run me again. I am stopping in case you still have something valuable there.

  3. 次に、必要に応じて「git rebase --continue」または「git rebase --abort」と入力します

    • これでウィンドウがリベースされます。キーボードの「i」キーをクリックしてください
    • 次に、10のコミットのリストを取得します[上記の10のコミットに合格したため]

    pick 897fe9e simplify code a little

    pick abb60f9 add new feature

    pick dc18f70 bugfix

  4. 次のように、編集するコミットのすぐ下に以下のコマンドを追加する必要があります

    pick 897fe9e simplify code a little exec git commit --amend --author 'Author Name <[email protected]>' pick abb60f9 add new feature exec git commit --amend --author 'Author Name <[email protected]>' pick dc18f70 bugfix exec git commit --amend --author 'Author Name <[email protected]>'

    1. これで、ESCを押すだけで:wqが設定されました。

    2. 次にgit Push Origin HEAD:BRANCH NAME -f [-f Force Pushに注意してください]

0
Kirtikumar A.

特に、変更したいコミットが複数ある場合には、この問題に対する怠惰なアプローチもあります。私の場合、私は間違った作者といくつかのコミットを持つ新しいブランチを持っていました。

元のブランチに移動してください:

git checkout develop

そこから新しいブランチを作る:

git checkout -b myFeature develop 

コミット情報なしで1つのコミットとしてマージする:

git merge --no-commit --squash branchWrongAuthor

変更を上演することもできます:

git stage .

作者の名前を変更し、変更を確定します。

git commit --amend --author "New Author Name <New Author Email>" -m "new feature added"

それで、変更をプッシュできます。

git Push

その後、間違った作者でブランチを削除することができます。

0
alexlz