1つの特定のコミットでコミット著者を変更する方法は?

StackOverflow https://stackoverflow.com/questions/3042437

  •  27-09-2019
  •  | 
  •  

質問

歴史における1つの特定のコミットの著者を変更したいと思います。それは最後のコミットではありません。

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

しかし、私は何かについて考えています。そこでは、ハッシュまたはショートハッシュによるコミットメントを特定します。

役に立ちましたか?

解決

あなたが変更する必要があるコミットよりも、歴史の早い段階のポイントからインタラクティブなリベース(git rebase -i <earliercommit>)。コミットのリストでrebasedされている場合は、テキストをから変更します pickedit 変更するもののハッシュの隣。次に、gitがコミットを変更するように求められたら、これを使用してください。

git commit --amend --author="Author Name <email@address.com>"

たとえば、コミット履歴がそうである場合 A-B-C-D-E-FF なので HEAD, 、そしてあなたはの著者を変えたいです CD, 、それならあなたは...

  1. 特定 git rebase -i B (これがあなたが実行した後にあなたが見るものの例です git rebase -i B 指図)
    • 編集する必要がある場合 A, 、 使用する git rebase -i --root
  2. 両方の行を変更します CD から pickedit
  3. リベースが始まると、最初に一時停止します C
  4. するでしょう git commit --amend --author="Author Name <email@address.com>"
  5. それで git rebase --continue
  6. 再び一時停止します D
  7. そうなります git commit --amend --author="Author Name <email@address.com>" また
  8. git rebase --continue
  9. リベースが完了します。
  10. 使用する git push -f 更新されたコミットで起源を更新する。

他のヒント

受け入れられた答え この質問には、インタラクティブなリベースの驚くほど巧妙な使用がありますが、残念ながら、以前の著者を変更しようとしているコミットメントが、その後統合されたブランチに変更しようとしている場合、紛争を示します。歴史。

GITの履歴を書き直すための環境変数の設定と未解決の変数に依存するスクリプトを実行することに不安を抱いているので、私はに基づいて新しい答えを書いています この郵便受け に似ています この答え しかし、より完全です。

リンクされた答えとは異なり、以下はテストされ、動作します。それを明確にするために想定します 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).

    git push --force-with-lease
    

4-6の代わりに、新しいコミットに戻すことができます。

git rebase -i 42627abe

GitHubドキュメントには含まれています 支店内のすべてのコミットのコミッター情報を置き換えるスクリプト.

#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"

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
  • メールをグローバルに構成にリセットします。

    git config --global user.email example@email.com

  • ここで、編集せずにあなたのコミットの著者をリセットします:

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

以下のコマンドを使用して、最後のコミットの著者を変更できます。

git commit --amend --author="Author Name <email@address.com>"

ただし、複数の著者名を変更したい場合は、少し注意が必要です。インタラクティブなリベースを開始し、マークが編集としてコミットし、それらを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? メッセージ。

あなたがリンクした質問の答えは良い答えであり、あなたの状況をカバーしています(他の質問は複数のコミットの書き換えを伴うため、より一般的です)。

試してみる言い訳として git filter-branch, 、著者名や著者のメールを書き換えて、特定のコミットについて著者の名前や著者の電子メールを書き直すためのスクリプトを書きました。

#!/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

前にコミット:

enter image description here

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

git commit --amend --author="Author Name <email@address.com>"

または、あなたの名前と電子メールを再利用するには、ただ書くことができます。

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 <foo@bar.com>\"" 4025621

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

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

そして実行してください:

git reauthor 4025621 Eugen

追加のステップが1つあります アンバーの答え 集中リポジトリを使用している場合:

git push -f 中央リポジトリの更新を強制する。

一貫性を台無しにする可能性があるため、同じブランチで働いている人は多くないことに注意してください。

やったとき git rebase -i ドキュメントにはこの興味深いビットがあります:

2つ以上のコミットを1つに折りたたむ場合は、コマンドを交換します "pick" 2番目とその後のコミットメントのために "squash" また "fixup". 。コミットが異なる著者を持っている場合、折りたたまれたコミットは最初のコミットの著者に起因します。折りたたまれたコミットに対する提案されたコミットメッセージは、最初のコミットととのコミットメッセージの連結です "squash" コマンドですが、コミットのコミットメッセージを省略します "fixup" 指図。

  • の歴史がある場合 A-B-C-D-E-F,
  • そして、あなたはコミットを変えたいです BD (= 2コミット)、

その後、あなたはできます:

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • 空のコミットを作成します(コミットごとに1つ):
    • Rebaseの目的のためのメッセージが必要です
    • git commit --allow-empty -m "empty"
  • リベース操作を開始します
    • git rebase -i B^
    • B^ の親を選択します B.
  • 空のコミットを1つ置きたいと思うでしょう それぞれが変更にコミットします
  • あなたは変えたいと思うでしょう 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...

そして、最初の数行を削除することができます。

にさらに役立ちます Eugen Konkov 応答、ルートコミットから開始するには、使用してください --root 国旗。 --no-edit フラグも役立ちます

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

変更する必要があるのは、最後のコミットの著者であり、他の人がリポジトリを使用していない場合、最後のコミットを元に戻すことができます。

git push -f origin last_commit_hash:branch_name 

コミットの著者名を変更してください。

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

コードを開いて再び開くエディターを終了します。

git push

また、この問題には怠zyなアプローチがあります。特に、変更したいというコミットを複数持っている場合はそうです。私の場合、私は間違った著者といくつかのコミットメントを持つ新しい支店を持っていたので、何が私を助けたのか:

元のブランチに移動します:

git checkout develop

そこから新しいブランチを作成します:

git checkout -b myFeature develop 

コミット情報なしでそれをマージします。

git merge --no-commit --squash branchWrongAuthor

また、変更をステージングしたい場合があります。

git stage .

著者の名前を変更し、変更をコミットします。

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

それだけです、あなたは変化をプッシュすることができます。

git push

その後、間違った著者でブランチを削除できます。

変更したいコミットが最後のコミットではない場合は、以下の手順に従ってください。コミットが異なるブランチにある場合、最初にそのブランチに切り替えます。

gitチェックアウトbranch_name

変更したいコミットの前にコミットを見つけて、ハッシュを見つけます。次に、Rebaseコマンドを発行します。

git rebase -i -p commitのハッシュ

その後、エディターが開き、変更したいコミットのために「編集」します。他の人にデフォルトの「ピック」オプションを残します。変更されたら、「ESC」キーとWQを入力します!出る。

次に、修正オプションでGit Commitコマンドを発行します。

git commit -amend -author = "username email" - no-edit

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

git rebase - continue

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

コミットプッシュ後に著者名を変更する手順

  1. コミットIDと詳細を取得するための最初のタイプ「git log」
  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」または「git rebase- abort」と入力します

    • これで、ウィリューズウィンドウが開き、キーボードから「i」キーをクリックします
    • 次に、下記のように、コミットのリストを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 <author.name@mail.com>' pick abb60f9 add new feature exec git commit --amend --author 'Author Name <author.name@mail.com>' pick dc18f70 bugfix exec git commit --amend --author 'Author Name <author.name@mail.com>'

    1. それだけです、今すぐESCを押すだけです:WQとあなたはすべて設定されています

    2. 次に、Git Push Origin Head:ブランチ名-f [-f Force Pushの世話をしてください

    お気に入り git push -f また git push origin HEAD: dev -f

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top