web-dev-qa-db-ja.com

Gitで複数のコミットの作者とコミッターの名前とEメールを変更するにはどうすればいいですか?

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

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

2165
Flávio Amieiro

作者(またはコミッタ)を変更すると、すべての履歴を書き換える必要があります。それで大丈夫で価値があると思うなら、 git filter-branch をチェックしてください。マニュアルページには、作業を開始するための例がいくつか含まれています。また、環境変数を使って作者の名前、コミッター、日付などを変更することもできます。 gitのmanページ の「環境変数」の節を参照してください。

具体的には、このコマンドを使えば、間違った作者名やメールアドレス すべてのブランチやタグ を修正できます(source: GitHub help ):

#!/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
974
Pat Notz

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

あなたはできる

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

それから、リベースファイルであなたの悪いコミットをすべて "編集"としてマークしてください。最初のコミットも変更したい場合は、リベースファイルの最初の行として手動で追加する必要があります(他の行のフォーマットに従ってください)。それから、gitがあなたに各コミットを修正するように頼むとき、

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

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

git rebase --continue

リベースを続行します。

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

git commit --amend --author "New Author Name <[email protected]>" --no-edit && \
git rebase --continue

シングルコミット

最近のコミットを変更したいだけなら、rebaseコマンドは必要ありません。やるだけ

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

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

 git -c user.name="New Author Name" -c [email protected] commit --amend --reset-author

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

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

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

1487
asmeurer

次のこともできます。

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
577
Rognon

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

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
512

$ HOME/.gitconfigが初期化されていない場合に起こります。これを次のように修正することができます。

git config --global user.name "you name"
git config --global user.email [email protected]
git commit --amend --reset-author

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

212
lrkwz

シングルコミットの場合:

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

(asmeurerの回答から抜粋)

181
blueyed

一番上のいくつかのコミットだけが悪い作者を持っている場合、以下のようにexecコマンドとgit rebase -iコミットを使用して、--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 protected]>" -C HEAD
pick 1234 my bad commit 2
exec git commit --amend --author="New Author Name <[email protected]>" -C HEAD

(実行するために)エディタを保存して終了します。

この解決策は他のものよりも入力に時間がかかるかもしれませんが、それは高度に制御可能です。

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

166
Alex Brown

Githubには Niceという解決策 があり、これは次のシェルスクリプトです。

#!/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" = "[email protected]" ]
then
    cn="Your New Committer Name"
    cm="Your New Committer Email"
fi
if [ "$GIT_AUTHOR_EMAIL" = "[email protected]" ]
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"
'
108
Olivier Verdier

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
80
svick

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

git commit --amend --reset-author

47
Ryanmt

これを alias として使用すると、次のことができます。

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

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

git change-commits GIT_AUTHOR_EMAIL "[email protected]" "[email protected]" 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/config/gitconfig

それが役に立つことを願っています。

40
brauliobo

これは@ 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つを受け取るかもしれません:

  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オプションの簡単な説明が必要かもしれません:それはfilter-branchが all refs (すべてのブランチを含む)のすべてのリビジョンで動作するようにします。これは、たとえばタグも書き換えられ、書き換えられたブランチに表示されることを意味します。

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

38
stigkj
  1. git rebase -i <sha1 or ref of starting point>を実行する
  2. 変更したいすべてのコミットをedit(またはe)でマークします。
  3. すべてのコミットを処理するまで、次の2つのコマンドを繰り返します。

    git commit --amend --reuse-message=HEAD --author="New Author <[email protected]>"; git rebase --continue

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

23
sporsh

タグとすべてのブランチを含むリポジトリ全体の作者を書き直すには、次のようにします。

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

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

git for-each-ref --format="%(refname)" refs/original/ | \
xargs -n 1 git update-ref -d
21

私はこの ソリューション を適応させました。これは単純なauthor-conv-fileを取り込むことによって働きます(フォーマットは git-cvsimport のものと同じです)。これはすべてのブランチでauthor-conv-fileで定義されているようにすべてのユーザーを変更することによって機能します。

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

author-conv-file

john=John Doe <[email protected]>
jill=Jill Doe <[email protected]>

スクリプト:

 #!/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
20
Leif Gruenwoldt

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

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

Allオプションのためのleif81への称賛。

#!/bin/bash

git filter-branch --env-filter '
if [ "$GIT_AUTHOR_NAME" = "<old author>" ];
then
    GIT_AUTHOR_NAME="<new author>";
    GIT_AUTHOR_EMAIL="<[email protected]>";
fi
if [ "$GIT_COMMITTER_NAME" = "<old committer>" ];
then
    GIT_COMMITTER_NAME="<new commiter>";
    GIT_COMMITTER_EMAIL="<[email protected]>";
fi
' -- --all
18
drahnr
  1. コミットauthor name & emailAmendで変更し、old-commit with new-oneを置き換えます。

    $ git checkout <commit-hash>                            # checkout to the commit need to modify  
    $ git commit --amend --author "name <[email protected]>" # change the author name and email
    
    $ git replace <old-commit-hash> <new-commit-hash>      # replace the old commit by new one
    $ git filter-branch -- --all                           # rewrite all futures commits based on the replacement                   
    
    $ git replace -d <old-commit-hash>     # remove the replacement for cleanliness 
    $ git Push -f Origin HEAD              # force Push 
    
  2. 別の方法はRebasing

    $ git rebase -i <good-commit-hash>      # back to last good commit
    
    # Editor would open, replace 'pick' with 'edit' before the commit want to change author
    
    $ git commit --amend --author="author name <[email protected]>"  # change the author name & email
    
    # Save changes and exit the editor
    
    $ git rebase --continue                # finish the rebase
    
17
Sajib Khan

唯一の問題が作者/ Eメールがあなたのいつものものと異なるということであるならば、私は指摘しなければなりません、これは問題ではありません。正しい修正方法は、ディレクトリのベースに.mailmapというファイルを次のような行で作成することです。

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

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

これは履歴を書き換える必要がないという点で、ここで他のすべての解決策の利点を持ちます。上流を持っている場合は問題を引き起こす可能性があり、常に誤ってデータを失うことになります。

もちろん、あなたが自分自身で何かをコミットし、それが本当に他の誰かであるべきで、この時点で歴史を書き換えることを気にしないのであれば、コミットの作者を変更することは帰属の目的でおそらく良い考えです。他の答えはこちら).

15
asmeurer

あなたがこのリポジトリの唯一のユーザであるならば、 歴史を書き換えるgit filter-branchsvickが書いたように )、または git fast-export / git fast-import +フィルタスクリプトを使うことができます( docgnome answer で参照されている記事で説明されているように)、または対話式の rebase 。しかし、どちらも最初に変更されたコミット以降の変更を変更します。これはあなたのブランチの書き換え前の変更に基づいた誰かにとってのトラブルを意味します。

RECOVERY

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

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

他の開発者が機能ブランチを使用している、またはgit pull --rebaseが機能していない場合上流はセットアップされていないので、彼らは rebase 書き換え後のコミットの上に自分の仕事をしなければなりません。例えば、新しい変更を取得した直後(git fetch)、Origin/masterからの/ forkに基づくmasterブランチでは、実行する必要があります。

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

ここでOrigin/master@{1}は書き換え前の状態(取得前)です。 gitrevisions を参照してください。


別の解決策は refs/replace / メカニズムを使うことでしょう。これはGitのバージョン1.6.5から利用可能です。このソリューションでは、間違ったEメールを持っているコミットの代わりをします。 'replace'参照(theirfetch = +refs/replace/*:refs/replace/*の適切な場所にある.git/config refspecのようなもの)を透過的に取得する人は誰でも透過的に置換を取得し、それらの参照を取得しない人は古いコミットを見るでしょう。

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

  1. 次のように、間違ったEメールを含むすべてのコミットを見つけます。

    $ git log [email protected] --all
    
  2. 誤ったコミットごとに、置換コミットを作成し、それをオブジェクトデータベースに追加します。

    $ git cat-file -p <ID of wrong commit> | 
      sed -e 's/user@wrong\.email/[email protected]/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 [email protected] --all
    

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

未テスト! YMMV。

refs/replace/メカニズムを使用するとき、いくつかの大まかなコーナーに遭遇するかもしれないことに注意してください:それは新しい、そしてまだあまりよくテストされていない

9
Jakub Narębski

最後のN個のコミットの作者を変更したいとします。

git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <[email protected]>' --no-edit"

ノート

  • --no-editフラグは、git commit --amendが追加の確認を求めないようにします
  • git rebase -iを使うとき、作者を変更するコミットを手動で選択できます。

編集したファイルは次のようになります。

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

それでもいくつかの行を修正して、作成者を変更したい場所を確認できます。これは自動化と制御の間の良い中間点をあなたに与えます:あなたは実行されるステップを見ます、そしてあなたが一度保存するとすべてが一度に適用されるでしょう。

7
Chris Maes

修正したいコミットが最新のもので、そのうちの2つだけの場合は、git resetgit stashの組み合わせを使用して、正しい名前とEメールアドレスを設定した後で再度コミットします。

シーケンスは次のようになります(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
6
djromero

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

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

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

  • 現在のブランチで著者のマッチングを変更する

    $ git changemail -a [email protected] -n newname -m [email protected]
    
  • <branch>と<branch2>の作成者とコミッターのマッチングを変更します。バックアップの書き換えを可能にするために-fをfilter-branchに渡します

    $ git changemail -b [email protected] -n newname -m [email protected] -- -f &lt;branch> &lt;branch2>
    
  • レポに既存のユーザーを表示する

    $ git changemail --show-both
    

ちなみに、変更を加えたら、filter-branchから次のようにしてバックアップを消去します。 git-backup-clean

5
albfan

著者名のUTF8文字がビルドサーバー上で問題を引き起こしていたという今日の問題を経験したので、これを修正するために履歴を書き直さなければなりませんでした。行われた手順は次のとおりです。

ステップ1:ここに書かれている手順に従って、今後のすべてのコミットのためにgitでユーザー名を変更してください: https://help.github.com/articles/setting-your-username-in-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="[email protected]"
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マシン上で再実行する必要がありました。

5

Gitは 2つの - 異なる電子メールアドレスを保存します。1つは committer (変更をコミットした人)、もう1つは author (書いた人)です。変化)。

コミッター情報はほとんどの場所に表示されませんが、git log -1 --format=%cn,%ce(または特定のコミットを指定するためにshowの代わりにlogを使用)で見ることができます。

最後のコミットの作者を変更するのはgit commit --amend --author "Author Name <[email protected]>"のように簡単ですが、コミッター情報に同じことをするためのワンライナーや議論はありません。

解決策は、(一時的かどうかにかかわらず)ユーザー情報を変更してからコミットを修正することです。これにより、コミッターが現在の情報に更新されます。

git config user.email [email protected] 
git commit --amend
5
Sir Athos

対話式リベースを使用して、変更したい各コミットの後に修正コマンドを配置できます。例えば:

pick a07cb86 Project tile template with full details and styling
x git commit --amend --reset-author -Chead
5
j16r

あなたがEGitと一緒にEclipseを使っているならば、それから非常に簡単な解決策があります。
仮定:あなたはローカルブランチ 'local_master_user_x'にコミットしていますが、無効なユーザーのためにリモートブランチ 'master'にプッシュすることはできません。

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

これを行う最も簡単で簡単な方法は、git rebaseの--exec引数を使用することです。

git rebase -i -p --exec 'git commit --amend --reset-author --no-edit'

これは、次のようなTODOリストを作成します。

pick ef11092 Blah blah blah
exec git commit --amend --reset-author --no-edit
pick 52d6391 Blah bloh bloo
exec git commit --amend --reset-author --no-edit
pick 30ebbfe Blah bluh bleh
exec git commit --amend --reset-author --no-edit
...

これはすべて自動的に機能します。これは、何百ものコミットがあるときに機能します。

4
Lie Ryan

あなたがこのリポジトリの唯一のユーザであるか、あるいは他のユーザのためにリポジトリを壊すことを気にしないのであれば、はい。あなたがこれらのコミットをプッシュし、他の場所からアクセスできる場所に存在するのであれば、他の人のリポジトリを壊すことを気にしないのでなければ、そうではありません。問題は、これらのコミットを変更することによって、新しいSHAを生成することになり、それによってそれらが異なるコミットとして扱われることになります。他の誰かがこれらの変更されたコミットを引き込もうとすると、歴史は異なり、kaboomです。

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

2
baudtack

例も追加したい。与えられたパラメータで bash_functionを作成したいです。

これはmint-linux-17.3で動作します

# $1 => email to change, $2 => new_name, $3 => new E-Mail

function git_change_user_config_for_commit {

 # defaults
 WRONG_EMAIL=${1:-"[email protected]"}
 NEW_NAME=${2:-"your name"}
 NEW_EMAIL=${3:-"[email protected]"}

 git filter-branch -f --env-filter "
  if [ \$GIT_COMMITTER_EMAIL = '$WRONG_EMAIL' ]; then
    export GIT_COMMITTER_NAME='$NEW_NAME'
    export GIT_COMMITTER_EMAIL='$NEW_EMAIL'
  fi
  if [ \$GIT_AUTHOR_EMAIL = '$WRONG_EMAIL' ]; then
    export GIT_AUTHOR_NAME='$NEW_NAME'
    export GIT_AUTHOR_EMAIL='$NEW_EMAIL'
  fi
 " --tag-name-filter cat -- --branches --tags;
}
2

これを試してみてください。これは上記と同じですが、対話式に行われます。

bash <(curl -s  https://raw.githubusercontent.com/majdarbash/git-author-change-script/master/run.sh)

参照: https://github.com/majdarbash/git-author-change-script

1
Majd Arbash
git rebase -i YOUR_FIRTS_COMMIT_SHA^

while true; do git commit --amend --author="Name Surname <[email protected]>" --no-edit && git rebase --continue; done

リベースが終わったら^ C#を押してください(ループは最後のコミットを更新し続けます)

0
Vojtech Vitek