Git で複数のコミットの作成者名、コミッター名、電子メールアドレスを変更するにはどうすればよいですか?
-
09-09-2019 - |
質問
私は学校のコンピューターで簡単なスクリプトを作成し、その変更を Git (自宅のコンピューターからクローンしたペンドライブにあるリポジトリ) にコミットしていました。何度かコミットした後、root ユーザーとしてコミットしていることに気づきました。
これらのコミットの作成者を私の名前に変更する方法はありますか?
解決
作成者 (またはコミッター) を変更するには、すべての履歴を書き直す必要があります。それでも大丈夫で、それだけの価値があると思うなら、ぜひチェックしてみてください git フィルターブランチ. 。man ページには、開始するためのいくつかの例が含まれています。また、環境変数を使用して作成者、コミッター、日付などの名前を変更できることにも注意してください。-- 「環境変数」セクションを参照してください。 gitのマニュアルページ.
具体的には、間違った著者名とメールアドレスをすべて修正できます。 すべてのブランチとタグに対して このコマンドを使用します (出典: 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 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
シングルコミット
コメンターのいくつかが指摘したように、あなただけの最新のコミットを変更したい場合は、、、リベースコマンドは必要ありません。ただ、やる
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
するgit rebase
フラグを使用することです。 git rebase
のマンページが-p
と-i
を使用して問題につながることを警告しますが、BUGS
セクションにそれが言う「の編集がコミットし、正常に動作する必要があります彼らのコミットメッセージをrewording。」
私は、上記のコマンドに-p
を追加しました。あなただけの最新のコミットを変更している場合には、これは問題ではありません。
また、行うことができます:
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
ワンライナーが、あなたは、マルチユーザー・リポジトリを持っている場合は注意してください - これは、すべてのを変更しますは同じ(新)作者とコミッタを持つようにコミット
。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
それは起こります。あなたはこの問題を解決することがあります。
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でテスト
のための単一のコミットます:
git commit --amend --author="Author Name <email@address.com>"
(asmeurerの答えから抽出された)
ちょうど上位のいくつかのコミットが悪い作家を持っている場合は、あなたは、すべての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のおかげます。
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"
'
docgnome が述べたように、履歴の書き換えは危険であり、他の人のリポジトリを破壊することになります。
しかし、本当にそれを行いたい場合で、bash 環境を使用している場合 (Linux では問題ありません。Windows では、git のインストールで提供される git bash を使用できます)、次を使用します。 git フィルターブランチ:
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
、これを処理する簡単な方法があります。
git commit --amend --reset-author
として利用することができる 別名 可能になっています。
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
希望ので便利です。
これは緻版@Brianのバージョン:
変更をコミット者、これを実行する事ができます。(linebreaksの文字列である可能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
がでる場合がありますがこれらのエラー:
- 一時ディレクトリが存在してい
- ヒ始 refオリジナル が存在してい
(これは他のフィルター-支店を実行する以前のリポジトリの次元の支店を参照のバックアップで refオリジナル)
したい場合力にもかかわらず、エラーの追加 --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
オプションが必要な場合があります:このフィルター-支店の作業をすべての改定に すべてのrefs (全店).このように、例えば、タグも書き換えが可視に書き換えます。
共通の"ミス"が利用 HEAD
代わりに、フィルタリングすべての改定かがでしょうか 現在の支店.そしてないタグ(その他のref)が存在し書き換えます。
- 走
git rebase -i <sha1 or ref of starting point>
- マークすべての犯変更したいと
edit
(e
) ループは以下の二つのコマンドにまで処理すべての犯:
git commit --amend --reuse-message=HEAD --author="New Author <new@author.email>"
;git rebase --continue
このすべてのその他のコミット情報を含む)を用意した。の --reuse-message=HEAD
オプション防止のメッセージ編集からの乗艇してください。
私はタグとすべての支店を含め、リポジトリ全体のために著者を書き換えるには、以下の使用します:
git filter-branch --tag-name-filter cat --env-filter "
export GIT_AUTHOR_NAME='New name';
export GIT_AUTHOR_EMAIL='New email'
" -- --all
次に、フィルタ分岐するのマニュアルページに記載されているように、削除すべての元の参考文献はfilter-branch
によってバックアップ(これは破壊的であり、バックアップ最初):
git for-each-ref --format="%(refname)" refs/original/ | \
xargs -n 1 git update-ref -d
私は(簡単なauthor-conv-file
を摂取することによって動作します。このソリューションを適応しましたフォーマットはのgit-cvsimport )。これは、すべての支店間author-conv-file
で定義されているすべてのユーザを変更することで動作します。
私たちは、CVSからのgitに私たちのリポジトリを移行するcvs2git
と一緒にこれを使用します。
すなわち。サンプル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
私はあなたが他の開発者からパッチをコミットする場合は特に、これは基本的に自分のコードを盗むだろう、積極的に提示したバージョンの方法を見つけます。
以下のバージョンでは、すべてのブランチ上で作業を行い、それを防ぐために、別々の作者とコミッタを変更します。
すべてのオプションのために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
変更をコミット
author name & email
によるAmend
, その交換old-commit with new-one
:$ git checkout <commit-hash> # checkout to the commit need to modify $ git commit --amend --author "name <author@email.com>" # 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
別の言い方
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 <author@email.com>" # change the author name & email # Save changes and exit the editor $ git rebase --continue # finish the rebase
私が唯一の問題は作者/メールが通常と異なっていることであれば、これは問題ではないことを指摘しなければなりません。正しい修正は
のような行でディレクトリのベースに.mailmap
というファイルを作成することです
Name you want <email you want> Name you don't want <email you don't want>
(あなたは、具体的ではないにそれらを指示しない限り)そして上から、同じように、これら二つの名前を検討するgit shortlog
などのコマンド。 http://schacon.github.com/git/git-shortlog.html詳細については、ます。
これは、ここでその中にあなたが上流を持っている場合は問題が発生する可能性があり、歴史を書き換える必要はありませんし、常に誤ってデータを失うための良い方法である他のすべてのソリューションの利点を持っています。
もちろん、あなた自身のように何かを犯し、それは本当に他の誰かであるべきであり、あなたは著者が、その場合には、私が直接(おそらく帰属目的のために良いアイデアですコミット変え、この時点で歴史を書き換え気にしない場合ここに私の他の答え)をあなたます。
A シングルコマンド 変更の形式(新規/継続)についての最後のN犯:
git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit"
注記
- の
--no-edit
フラグであることを確にgit commit --amend
なお、追加の確認 - ご利用の際は
git rebase -i
, きを手動で選択をする為に変化は著者
ファイルを編集すようなものです:
pick 897fe9e simplify code a little
exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
pick abb60f9 add new feature
exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
pick dc18f70 bugfix
exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
きものの変更一部のラインを参照したい場所を変更します。て作成することができ、素敵な面を制御:ご覧の手順を実行すると、一旦保存すべて適用されます。
の場合のみユーザーのこのリポジトリで 歴史を書き換え のいずれかを使 git filter-branch
( svick書) git fast-export
/git fast-import
プラスフィルターのスクリプト(記参照 docgnome回答)、インタラクティブ rebase.ものの見方を変える修正から変更をコミット以降;これはトラブル誰のために基づく手変更のお店の前に書き換え.
回復
場合その他の開発者の思に基づく作業の前に書き換え版では、単純ない再クローン(clone。
また触れることができる git rebase --pull
, は、早送りの場合はありませんで変化をリポジトリ、またはrebase所の再記述を犯しを避けるために合併していく前に書き換えcomits永遠に).すべてのこと仮定していないかもしれませんcomitted作使用 git stash
を貯蔵庫かに変化します。
その他の開発者用機能支店、および/または git pull --rebase
動作しないなどので上流域を設定していない場合があり、 rebase 仕事の後に書き換えを設定します。例えば、直後に既に新しい変化(git fetch
となり、 master
に基づいた支店/フォから origin/master
, で、ニーズの実行
$ git rebase --onto origin/master origin/master@{1} master
こちらの origin/master@{1}
事前に書き換え状態前のフェッチ)、 gitrevisions.
互いの利用 ref/replace/ 機構は、Gitてい1.6.5.次回のプレゼンテーションを提供する代替を犯している間違ったメール;その人を取り出します'置換'ref(のようなもの fetch = +refs/replace/*:refs/replace/*
refspec適切な場所に その .git/config
)に乗り換えをもとに透明性とのない方のフェッチ方refsいないを設定します。
の手続きの流れは、大まかには次のようになるこ:
すべての犯が合っていなかったメールの使用により、
$ git log --author=user@wrong.email --all
各間違ったコミットを交換コミットし、追加するオブジェクトデータベース
$ 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>
これで、修正にコミットオブジェクトデータベースは、伝えgitを自動的に透明性の高い置換の誤りを犯による補正を使
git replace
コマンド:$ git replace <ID of wrong commit> <ID of corrected commit>
最後に、全ての交換をチェックの場合この手順succeded
$ git replace -l
チェック場合は交換の場
$ git log --author=user@wrong.email --all
もちろんのこの手順を自動化...ものすべてを用いた以外は git replace
ない(し)バッチモード、あるいは利用シェープのために、交換"になります
試験は行っておりません! YMMV.
おつかの荒角利用の場合 refs/replace/
メカニズムでは、ないものを試験.
これを行うための最速、最も簡単な方法は、Gitのリベースの--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
...
これはあなたがコミットの数百を持っているときに動作している、すべて自動的に動作します。
は、あなたが正しい名前とメールアドレスを設定した後、再びそれらをコミット戻ってgit reset
とgit 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
ご利用の場合はEclipseとのEGit、それが簡単です。
想ている為、現地支店'local_master_user_x"はできません押されたリモート支店'士課程-博士前期課程では無効なユーザーです。
- 精算の遠隔支店'士課程-博士前期課程
- 選択したプロジェクト/フォルダ/ファイル'local_master_user_x'を含むの変更
- 右クリックし-交換-支店-'local_master_user_x'
- Commitこれらの変化は今回が初の正しいユーザーに支店'士課程-博士前期課程
- を押すリモート'士課程-博士前期課程
インタラクティブリベースを使用して、それぞれが変更したいコミットした後にコマンドを修正置くことができます。たとえばます:
pick a07cb86 Project tile template with full details and styling
x git commit --amend --reset-author -Chead
そのgitの店の 2 の異なる電子メールアドレス、のための1つを注意してください。のコミッターの(変更をコミットした人)との作者<ための別の1 / em>の(変更を書いた人)。
コミッターの情報はほとんどの場所に表示されていませんが、あなたはgit log -1 --format=%cn,%ce
でそれを参照してください(または特定のコミットを指定する代わりにshow
のlog
を使用)することができます。
コミットあなたの最後の著者を変更するgit commit --amend --author "Author Name <email@example.com>"
と同じくらい簡単ですがが、コミッターの情報に同じことを行うにはワンライナーまたは引数はありません。
ソリューションは、あなたの現在の情報にコミッターを更新なる、コミット改正、その後、ユーザー情報を変更する(一時的に、またはしない)になります。
git config user.email my_other_email@example.com
git commit --amend
著者名でUTF8文字がビルドサーバー上のトラブルを引き起こしていたところ我々は今日の問題を経験しているので、私たちはこれを修正するために、歴史を書き換えなければなりませんでした。撮影したの手順は以下の通りであった。
ステップ1:ここでは指示に従って、将来のすべてのコミットのためのgitでのユーザー名を変更します。 https://help.github.com/articles/setting-your-ユーザ名・イン・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マシン上でそれを再実行する必要がありました。
問題は共通です。見使用Mailmap修正著者一覧Git"
、簡単化のために、作成したスクリプトの処理: git-changemail
を入れた後、その上のスクリプトパスを発行できますコマンドのように:
変更著者マッチングが行現支店
$ git changemail -a old@email.com -n newname -m new@email.com
変化の著者とコミット者にマッチングが行わ <branch> や <branch2>.峠
-f
フィルター-支店を書き換えのバックアップ$ git changemail -b old@email.com -n newname -m new@email.com -- -f <branch> <branch2>
既存ユーザーレポ
$ git changemail --show-both
ちなみに、後のご変更は、クリーンからのバックアップフィルター-支店: git-バックアップ-クリーン
あなたはこのレポの唯一のユーザーであるか、あなたはおそらくはい、その後、他のユーザーのためのレポを壊す気にしないのであれば。あなたはこれらのコミットをプッシュしたし、彼らはそれらにアクセスできる場所どこかに存在する場合は、いいえ、あなたは他の人のレポを壊す気にしない場合を除きます。問題は、あなたがそれらを別のコミットとして扱われるようになります新しいシャスを生成されるこれらのコミットを変更することです。他の誰かがこれらの変更のコミットに引くしようとすると、歴史が違うとKABOOMです。
このページます。http:// inputvalidation .blogspot.com / 2008/08 /ハウツー変更-gitのコミット-author.html には、それを行う方法について説明します。 (私はこれを試していないYMMV)
私はあまりにも私の例を追加します。 私は与えられたパラメータでの bash_functionを作成したい。の
これはミントの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:-"you_wrong_mail@hello.world"}
NEW_NAME=${2:-"your name"}
NEW_EMAIL=${3:-"new_mail@hello.world"}
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;
}
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#が(ループを更新し続けるだろう、最後のコミット)