2703

私は学校のコンピューターで簡単なスクリプトを作成し、Gitへの変更をコミットしていました(自宅のコンピューターから複製された、ペンドライブにあるリポジトリ内)。何度かコミットした後、rootユーザーとしてコミットしていることに気づきました。

これらのコミットの作成者を私の名前に変更する方法はありますか?

4

40 に答える 40

1741

注:この回答はSHA1を変更するため、すでにプッシュされているブランチで使用する場合は注意が必要です。名前のスペルを修正したり、古いメールを更新したりするだけの場合は、gitを使用すると、を使用して履歴を書き換えることなくこれを行うことができます.mailmap私の他の答えを参照してください。

インタラクティブリベースの使用

あなたができる

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

次に、リベースファイルですべての不正なコミットを「編集」としてマークします。最初のコミットも変更する場合は、リベースファイルの最初の行として手動で追加する必要があります(他の行の形式に従います)。次に、gitが各コミットを修正するように要求したら、

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

開いたエディタを編集するか、単に閉じてから、

git rebase --continue

リベースを続行します。

--no-edit コマンドが次のようになるように追加することで、ここでエディターを完全に開くことをスキップできます。

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

シングルコミット

一部のコメント提供者が指摘しているように、最新のコミットを変更したいだけの場合は、rebaseコマンドは必要ありません。ただやる

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

これにより、作成者は指定された名前に変更されますが、コミッターはとで構成されたユーザーに設定されgit config user.nameますgit config user.email。コミッターを指定したものに設定する場合は、作成者とコミッターの両方が設定されます。

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

マージコミットに関する注意

私の最初の応答にはわずかな欠陥がありました。現在のHEADとあなたの間にマージコミットがある場合<some HEAD before all your bad commits>git rebaseそれらはフラットになります(ちなみに、GitHubプルリクエストを使用すると、履歴に大量のマージコミットがあります)。これは非常に多くの場合、非常に異なる履歴につながる可能性があり(重複する変更は「リベース」される可能性があるため)、最悪の場合、git rebase困難なマージの競合を解決するように求められる可能性があります(マージコミットですでに解決されている可能性があります) 。-p解決策は、フラグtoを使用することgit rebaseです。これにより、履歴のマージ構造が保持されます。のマンページは、使用すると問題が発生する可能性がgit rebaseあることを警告していますが、-p-iBUGSセクションには、「コミットの編集とコミットメッセージの言い換えは正常に機能するはずです」と書かれています。

-p上記のコマンドに追加しました。最新のコミットを変更するだけの場合、これは問題ではありません。

最新のgitクライアントの更新(2020年7月)

--rebase-mergesの代わりに使用してください-p-p非推奨であり、重大な問題があります)。

于 2009-08-24T03:08:51.323 に答える
1453

この回答git-filter-branchでは、ドキュメントで次の警告が表示されるようになりました。

git filter-branch には多くの落とし穴があり、意図した履歴の書き換えの明白でないマングリングを生成する可能性があります (パフォーマンスが非常に悪いため、そのような問題を調査する時間がほとんどない可能性があります)。これらの安全性とパフォーマンスの問題は下位互換性を保って修正できないため、その使用はお勧めしません。git filter-repoなどの別の履歴フィルタリング ツールを使用してください。それでも git filter-branch を使用する必要がある場合は、SAFETY (およびPERFORMANCE ) を注意深く読んで、filter-branch の地雷について学び、そこに記載されている危険をできるだけ合理的に回避してください。

作成者 (またはコミッター) を変更するには、すべての履歴を書き直す必要があります。それでも問題がなく、それだけの価値があると思われる場合は、git filter-branchをチェックしてください。man ページには、作業を開始するためのいくつかの例が含まれています。また、環境変数を使用して、作成者、コミッター、日付などの名前を変更できることにも注意してください。git man ページの「環境変数」セクションを参照してください。

具体的には、次のコマンドを使用して、すべてのブランチとタグの間違った作成者名と電子メールをすべて修正できます(ソース: 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 filter-repoを使用するには、まずそれをインストールし、 gitmailmapgit-mailmapの形式に従って を構築します。

Proper Name <proper@email.xx> Commit Name <commit@email.xx>

そして、作成したメールマップで filter-repo を実行します:

git filter-repo --mailmap git-mailmap
于 2009-04-15T03:16:42.690 に答える
691

1 つのライナーですが、マルチユーザー リポジトリがある場合は注意してください。これにより、すべてのコミットが同じ (新しい) 作成者とコミッターを持つように変更されます。

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

文字列に改行がある場合 (これは bash で可能です):

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
于 2009-04-15T03:22:10.603 に答える
602

次のこともできます。

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

Windows コマンド プロンプトでこのコマンドを使用している場合は、"代わりに次のコマンドを使用する必要があります'

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
于 2009-05-15T19:15:44.667 に答える
242

初期化されていない場合に発生します$HOME/.gitconfig。これは次のように修正できます。

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

gitバージョン1.7.5.4でテスト済み。

これは最後のコミットのみを修正することに注意してください。

于 2012-02-16T09:46:05.487 に答える
198

上位のいくつかのコミットだけに悪い作成者がいる場合は、次のように、コマンドとコミットgit rebase -iを使用して内部でこれをすべて行うことができます。exec--amend

git rebase -i HEAD~6 # as required

コミットの編集可能なリストが表示されます。

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

次に、exec ... --author="..."作成者が悪いすべての行の後に行を追加します。

pick abcd Someone else's 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

エディターを保存して終了します (実行します)。

このソリューションは、他のいくつかのソリューションよりも入力に時間がかかる場合がありますが、高度に制御可能です。どのコミットがヒットするかを正確に知っています。

インスピレーションをくれた @asmeurer に感謝します。

于 2011-12-08T17:05:03.690 に答える
190

単一のコミットの場合:

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

(asmeurerの回答から抜粋)

于 2010-04-26T22:50:54.550 に答える
116

Github には、次のシェル スクリプトである優れたソリューションがあります。

#!/bin/sh

git filter-branch --env-filter '

an="$GIT_AUTHOR_NAME"
am="$GIT_AUTHOR_EMAIL"
cn="$GIT_COMMITTER_NAME"
cm="$GIT_COMMITTER_EMAIL"

if [ "$GIT_COMMITTER_EMAIL" = "your@email.to.match" ]
then
    cn="Your New Committer Name"
    cm="Your New Committer Email"
fi
if [ "$GIT_AUTHOR_EMAIL" = "your@email.to.match" ]
then
    an="Your New Author Name"
    am="Your New Author Email"
fi

export GIT_AUTHOR_NAME="$an"
export GIT_AUTHOR_EMAIL="$am"
export GIT_COMMITTER_NAME="$cn"
export GIT_COMMITTER_EMAIL="$cm"
'
于 2010-10-07T09:54:14.417 に答える
84

docgnome が述べたように、履歴の書き換えは危険であり、他の人のリポジトリを破壊します。

ただし、本当にそれを実行したい場合で、bash 環境 (Linux では問題ありません。Windows では、git のインストールで提供される git bash を使用できます) を使用している場合は、git filter-branchを使用します。

git filter-branch --env-filter '
  if [ $GIT_AUTHOR_EMAIL = bad@email ];
    then GIT_AUTHOR_EMAIL=correct@email;
  fi;
export GIT_AUTHOR_EMAIL'

スピードアップするために、書き換えたいリビジョンの範囲を指定できます。

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
于 2010-08-04T00:52:53.897 に答える
50

これをエイリアスとして使用できるため、次のことができます。

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

または最後の10回のコミットの場合:

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

〜/ .gitconfigに追加します:

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

ソース:https ://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig

お役に立てば幸いです。

于 2012-08-01T23:09:12.633 に答える
49

マージされていないコミットを別の作成者から引き継ぐ場合、これを処理する簡単な方法があります。

git commit --amend --reset-author

于 2016-03-23T22:23:11.657 に答える
42

これは、@Brian のバージョンのより精巧なバージョンです。

作成者とコミッターを変更するには、これを行うことができます (bash で可能な文字列の改行を使用):

git filter-branch --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

次のいずれかのエラーが発生する場合があります。

  1. 一時ディレクトリは既に存在します
  2. refs/originalで始まる参照は既に存在します(これは、別のフィルターブランチが以前にリポジトリで実行され、元のブランチ参照がrefs/original
    にバックアップされていることを意味します)

これらのエラーにもかかわらず実行を強制したい場合は、次の--forceフラグを追加します。

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

-- --allこのオプションについて少し説明が必要かもしれません: これにより、すべての参照(すべてのブランチを含む) のすべてのリビジョンでフィルターブランチが機能します。これは、たとえば、タグも書き換えられ、書き換えられたブランチで表示されることを意味します。

よくある「間違い」は、代わ​​りに使用することです。これは、現在のブランチHEADだけですべてのリビジョンをフィルタリングすることを意味します。そして、書き換えられたブランチにはタグ (または他の参照) が存在しません。

于 2011-12-09T10:23:12.877 に答える
34

唯一の問題が、作成者/電子メールが通常と異なることである場合、これは問題ではないことを指摘しておく必要があります。正しい修正は、次.mailmapのような行でディレクトリのベースに呼び出されるファイルを作成することです

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

それ以降、コマンド likegit shortlogは、これらの 2 つの名前を同じものと見なします (そうしないように特に指示しない限り)。詳細については、 http://schacon.github.com/git/git-shortlog.htmlを参照してください。

これには、アップストリームがある場合に問題を引き起こす可能性のある履歴を書き換える必要がないという点で、ここにある他のすべてのソリューションの利点があり、常に誤ってデータを失う良い方法です。

もちろん、あなたが何かを自分自身としてコミットし、それが実際には他の誰かであるべきであり、この時点で履歴を書き換えてもかまわない場合、コミットの作成者を変更することは、帰属の目的のためにおそらく良い考えです (その場合、私はあなたを私のその他の回答はこちら)。

于 2012-02-28T23:57:32.817 に答える
25
  1. 走るgit rebase -i <sha1 or ref of starting point>

  2. 変更したいすべてのコミットをマークしますedit(またはe)

  3. すべてのコミットを処理するまで、次の 2 つのコマンドをループします。

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

これにより、他のすべてのコミット情報 (日付を含む) が保持されます。この--reuse-message=HEADオプションは、メッセージ エディターが起動しないようにします。

于 2012-10-04T02:22:52.930 に答える
24

以下を使用して、タグとすべてのブランチを含むリポジトリ全体の作成者を書き換えます。

git filter-branch --tag-name-filter cat --env-filter "
  export GIT_AUTHOR_NAME='New name';
  export GIT_AUTHOR_EMAIL='New email'
" -- --all

次に、filter-branch の MAN ページで説明されているように、バックアップされたすべての元の参照を削除しますfilter-branch(これは破壊的であり、最初にバックアップします)。

git for-each-ref --format="%(refname)" refs/original/ | \
xargs -n 1 git update-ref -d
于 2011-02-16T15:27:27.147 に答える
21

シンプルなものを取り込むことで機能するこのソリューションを採用しました(フォーマットはgit-cvsimportauthor-conv-fileのものと同じです)。すべてのブランチで定義されているすべてのユーザーを変更することで機能します。author-conv-file

これを組み合わせて使用​​してcvs2git、リポジトリを cvs から git に移行しました。

すなわちサンプルauthor-conv-file

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

スクリプト:

 #!/bin/bash

 export $authors_file=author-conv-file

 git filter-branch -f --env-filter '

 get_name () {
     grep "^$1=" "$authors_file" |
     sed "s/^.*=\(.*\) <.*>$/\1/"
 }

 get_email () {
     grep "^$1=" "$authors_file" |
     sed "s/^.*=.* <\(.*\)>$/\1/"
 }

 GIT_AUTHOR_NAME=$(get_name $GIT_COMMITTER_NAME) &&
     GIT_AUTHOR_EMAIL=$(get_email $GIT_COMMITTER_NAME) &&
     GIT_COMMITTER_NAME=$GIT_AUTHOR_NAME &&
     GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL &&
     export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL &&
     export GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL
 ' -- --all
于 2011-02-04T22:46:26.560 に答える
18

特に他の開発者からのパッチをコミットする場合、これは本質的に彼らのコードを盗むでしょう。

以下のバージョンはすべてのブランチで機能し、それを防ぐために作成者とコミッターを別々に変更します。

すべてのオプションについてleif81に敬意を表します。

#!/bin/bash

git filter-branch --env-filter '
if [ "$GIT_AUTHOR_NAME" = "<old author>" ];
then
    GIT_AUTHOR_NAME="<new author>";
    GIT_AUTHOR_EMAIL="<youmail@somehost.ext>";
fi
if [ "$GIT_COMMITTER_NAME" = "<old committer>" ];
then
    GIT_COMMITTER_NAME="<new commiter>";
    GIT_COMMITTER_EMAIL="<youmail@somehost.ext>";
fi
' -- --all
于 2012-04-23T08:46:54.910 に答える
9

このリポジトリの唯一のユーザーである場合は、( svick が書いたように) または/ plus フィルター スクリプト ( docgnome answerで参照されている記事で説明されているように)、または Interactive rebaseを使用して履歴を書き換えることができます。しかし、どちらも最初に変更されたコミット以降のリビジョンを変更します。これは、ブランチの事前書き換えに基づいて変更を行った人にとっては問題です。git filter-branchgit fast-exportgit fast-import

回復

他の開発者が書き直し前のバージョンに基づいて作業していない場合、最も簡単な解決策は再クローン (再度クローン) です。

またはgit rebase --pull、リポジトリに変更がなければ早送りするか、書き換えられたコミットの上にブランチをリベースします (マージは避けたいです。書き換え前のコミットが永久に保持されるためです)。これはすべて、彼らが仕事をしていないことを前提としています。それ以外の場合は、変更を隠しておくために使用git stashします。

他の開発者が機能ブランチを使用している場合、および/またはgit pull --rebaseアップストリームが設定されていないなどの理由で機能しない場合、書き換え後のコミットの上に自分の作業をリベースする必要があります。たとえば、新しい変更 ( git fetch)をフェッチした直後に、 にmaster基づく / からフォークされたブランチの場合、次origin/masterを実行する必要があります。

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

origin/master@{1}これは書き換え前の状態 (フェッチ前)です。 gitrevisionsを参照してください。


別の解決策は、バージョン 1.6.5 以降の Git で利用可能なrefs/replace/メカニズムを使用することです。このソリューションでは、電子メールが間違っているコミットの代替を提供します。その場合、「置換」参照 ( fetch = +refs/replace/*:refs/replace/*refspec の適切な場所にある refspec のようなもの) をフェッチする人は誰でも透過的に置換を取得し、それら .git/configの参照をフェッチしない人は古いコミットを見ることになります。

手順は次のようになります。

  1. たとえば、次を使用して、間違った電子メールですべてのコミットを検索します

    $ git log --author=user@wrong.email --all
    
  2. 間違ったコミットごとに、代わりのコミットを作成し、それをオブジェクト データベースに追加します。

    $ 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>
    
  3. git replaceオブジェクト データベースのコミットを修正したので、次のコマンドを使用して、間違ったコミットを修正したコミットに自動的かつ透過的に置き換えるように git に指示する必要があります。

    $ git replace <ID of wrong commit> <ID of corrected commit>
    
  4. 最後に、すべての交換をリストして、この手順が成功したかどうかを確認します

    $ git replace -l
    

    交換が行われるかどうかを確認します

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

git replaceもちろん、この手順を自動化することもできます...まあ、 (まだ)バッチモードを持っていない使用を除くすべてなので、そのためにシェルループを使用するか、「手動で」置き換える必要があります。

未検証!YMMV。

メカニズムを使用するときに、いくつかの荒いコーナーに遭遇する可能性があることに注意してくださいrefs/replace/: それは新しいものであり、まだ十分にテストされていません

于 2010-08-04T09:41:51.647 に答える
6

修正したいコミットが最新のもので、ほんの数個である場合は、 と の組み合わせを使用してgit resetgit stash正しい名前と電子メールを構成した後に再度コミットすることができます。

シーケンスは次のようになります (2 つの間違ったコミットの場合、保留中の変更はありません)。

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
于 2011-09-30T18:04:00.783 に答える
5

インタラクティブなリベースを使用すると、変更する各コミットの後に修正コマンドを配置できます。例えば:

pick a07cb86 Project tile template with full details and styling
x git commit --amend --reset-author -Chead
于 2013-02-26T13:19:47.143 に答える
5

あなたの問題は本当に一般的です。「Mailmap を使用して Git の作成者リストを修正する」を参照してください。

簡単にするために、プロセスを簡単にするスクリプトを作成しました: git-changemail

そのスクリプトをパスに配置した後、次のようなコマンドを発行できます。

  • 現在のブランチで著者の一致を変更する

    $ git changemail -a old@email.com -n newname -m new@email.com
    
  • <branch> と <branch2> の作成者とコミッターの一致を変更します。filter-branch に渡し-fて、バックアップの書き換えを許可します

    $ git changemail -b old@email.com -n newname -m new@email.com -- -f &lt;branch> &lt;branch2>
    
  • リポジトリに既存のユーザーを表示する

    $ git changemail --show-both
    

ところで、変更を行った後、次のようにフィルターブランチからバックアップを消去します: git-backup-clean

于 2015-01-03T12:19:08.033 に答える
5

EGit で Eclipse を使用している場合は、非常に簡単な解決策があります。
仮定: ローカル ブランチ 'local_master_user_x' に、無効なユーザーのためにリモート ブランチ 'master' にプッシュできないコミットがあります。

  1. リモート ブランチ 'master' をチェックアウトします。
  2. 「local_master_user_x」に変更が含まれているプロジェクト/フォルダー/ファイルを選択します
  3. 右クリック - 置き換え - ブランチ - 'local_master_user_x'
  4. これらの変更を再度コミットします。今度は正しいユーザーとして、ローカル ブランチ「マスター」にコミットします。
  5. リモート「マスター」にプッシュ
于 2011-08-24T17:54:19.353 に答える
5

本日、作成者名の UTF8 文字がビルド サーバーで問題を引き起こすという問題が発生したため、これを修正するために履歴を書き直す必要がありました。実行された手順は次のとおりです。

ステップ 1: https://help.github.com/articles/setting-your-username-in-git/の指示に従って、将来のすべてのコミットのために git でユーザー名を変更します。

ステップ 2: 次の bash スクリプトを実行します。

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

簡単な概要: リポジトリを一時ファイルにチェックアウトし、すべてのリモート ブランチをチェックアウトし、履歴を書き換えるスクリプトを実行し、新しい状態を強制的にプッシュし、変更を取得するためにリベース プルを行うように同僚全員に伝えます。

これを OS X で実行すると、コミット メッセージの行末が何らかの形で台無しになり、後で Linux マシンで再実行する必要がありました。

于 2014-10-22T03:32:28.180 に答える
2

あなたがこのレポの唯一のユーザーである場合、または他のユーザーのレポを壊す可能性を気にしない場合は、はい。これらのコミットをプッシュし、他の場所からアクセスできる場所に存在する場合は、他の人のリポジトリを壊すことを気にしない限り、いいえ。問題は、これらのコミットを変更すると、新しい SHA が生成され、異なるコミットとして扱われることになります。他の誰かがこれらの変更されたコミットを取り込もうとすると、履歴が異なり、カブームになります。

このページhttp://inputvalidation.blogspot.com/2008/08/how-to-change-git-commit-author.htmlでその方法を説明しています。(私はこれを試していないのでYMMV)

于 2010-08-04T00:40:57.563 に答える
1
git rebase -i YOUR_FIRTS_COMMIT_SHA^

while true; do git commit --amend --author="Name Surname <email@example.com>" --no-edit && git rebase --continue; done

リベースが完了したら ^C # を押します (ループは最後のコミットを更新し続けます)

于 2016-12-07T22:53:50.563 に答える
1

上記のすべての回答は、リポジトリの履歴を書き換えます。変更する名前が複数の作成者によって使用されていない限り、特にリポジトリが共有されていてコミットが古い場合は、 https://git-scm.com/docs/git-.mailmapに記載されている を使用することをお勧めしますショートログ。リポジトリの履歴を変更せずに、間違った名前/メールを正しいものにマッピングできます。次のような行を使用できます。

Proper Name <proper@email.xx> <root@localhost>
于 2019-08-30T20:19:20.010 に答える
0

Windows の下にある場合は、git-rocket-filterツールを使用することもできます。

ドキュメントから:

コミットの作成者名と電子メールを変更します。

git-rocket-filter --branch TestBranch --commit-filter '
    if (commit.AuthorName.Contains("Jim")) {   
        commit.AuthorName = "Paul"; 
        commit.AuthorEmail = "paul@company.com"; 
    }
于 2019-10-30T10:08:23.380 に答える
-1

これはあなたの質問に対する回答ではなく、将来これを回避するために使用できるスクリプトです。Git バージョン 2.9以降で使用可能なグローバル フックを利用して、次のディレクトリに基づいて電子メールの構成をチェックします。

#!/bin/sh
PWD=`pwd`
if [[ $PWD == *"Ippon"* ]] # 1)
then
  EMAIL=$(git config user.email)
  if [[ $EMAIL == *"Work"* ]] # 2)
  then
    echo "";
  else
    echo "Email not configured to your Work email in the Work directory.";
    git config user.email "youremail@youremail.com"
    echo "Git email configuration has now been changed to \"$(git config user$
    echo "\nPlease run your command again..."
    echo ''
    exit 1
  fi;
elif [[ $PWD == *"Personal"* ]]
then
  EMAIL=$(git config user.email)
  if [[ $EMAIL == "youremail@youremail.com" ]]
  then
    echo "";
  else
    echo "Email is not configured to your personal account in the Personal di$
    git config user.email "youremail@youremail.com"
    echo "Git email configuration has now been changed to \"$(git config user$
    echo "\nPlease run your command again..."
    echo ''
    exit 1;
  fi;
fi; 

現在の作業ディレクトリをチェックし、git が正しい電子メールに設定されていることを確認します。そうでない場合は、自動的に変更されます。詳細はこちらをご覧ください。

于 2016-12-15T15:04:56.247 に答える