私は学校のコンピュータで簡単なスクリプトを書き、Gitへの変更をコミットしていました(私のペンドライブにあり、自宅のコンピュータから複製されたレポ)。何度かコミットした後、私は自分がrootユーザーとしてコミットしていることに気づきました。
これらのコミットの作者を私の名前に変更する方法はありますか?
作者(またはコミッタ)を変更すると、すべての履歴を書き換える必要があります。それで大丈夫で価値があると思うなら、 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
あなたはできる
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
が困難なマージ衝突を解決するように頼むことになります(おそらくマージコミットで解決済み) 。解決策は、-p
にgit rebase
フラグを使用することです。これにより、履歴のマージ構造が保持されます。 git rebase
のマンページでは、-p
と-i
を使用すると問題が発生する可能性があることを警告していますが、BUGS
セクションには「コミットの編集とコミットメッセージの書き換えはうまくいくはずです」と記載されています。
上記のコマンドに-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
ライナーは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
$ 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でテスト済み
一番上のいくつかのコミットだけが悪い作者を持っている場合、以下のように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に感謝します。
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"
'
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
他の作者からマージされていないコミットを引き継ぐとき、これを処理する簡単な方法があります。
git commit --amend --reset-author
これを 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
それが役に立つことを願っています。
これは@ 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つを受け取るかもしれません:
これらのエラーにもかかわらず強制的に実行したい場合は、--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
を使うことです。これは、 現在のブランチ だけですべてのリビジョンをフィルタリングすることを意味します。そして、書き換えられたブランチにはタグ(または他の参照)は存在しません。
git rebase -i <sha1 or ref of starting point>
を実行するedit
(またはe
)でマークします。すべてのコミットを処理するまで、次の2つのコマンドを繰り返します。
git commit --amend --reuse-message=HEAD --author="New Author <[email protected]>"
; 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
次に、 MAN filter-branch ページで説明されているように、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 <[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
特にあなたが他の開発者からのパッチをコミットした場合、これは本質的に彼らのコードを盗むでしょう。
以下のバージョンはすべてのブランチで動作し、それを防ぐために作者とコミッターを別々に変更します。
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
コミット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 <[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
別の方法は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
唯一の問題が作者/ 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 を参照してください。
これは履歴を書き換える必要がないという点で、ここで他のすべての解決策の利点を持ちます。上流を持っている場合は問題を引き起こす可能性があり、常に誤ってデータを失うことになります。
もちろん、あなたが自分自身で何かをコミットし、それが本当に他の誰かであるべきで、この時点で歴史を書き換えることを気にしないのであれば、コミットの作者を変更することは帰属の目的でおそらく良い考えです。他の答えはこちら).
あなたがこのリポジトリの唯一のユーザであるならば、 歴史を書き換えるgit filter-branch
( svickが書いたように )、または 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のようなもの)を透過的に取得する人は誰でも透過的に置換を取得し、それらの参照を取得しない人は古いコミットを見るでしょう。
手順は次のようになります。
次のように、間違ったEメールを含むすべてのコミットを見つけます。
$ git log [email protected] --all
誤ったコミットごとに、置換コミットを作成し、それをオブジェクトデータベースに追加します。
$ 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>
オブジェクトデータベースのコミットを修正したので、 git replace
コマンドを使用して、gitに間違ったコミットを自動的かつ透過的に修正したコミットに置き換えるように指示する必要があります。
$ git replace <ID of wrong commit> <ID of corrected commit>
最後に、この手順が成功したかどうかを確認するためにすべての置換をリストします。
$ git replace -l
そして取り替えが行われるかどうか確認して下さい
$ git log [email protected] --all
もちろん、(まだ)バッチモードを持たないgit replace
を使用することを除いて、この手順を自動化することもできます。そのためには、シェルループを使用するか、「手動で」置き換える必要があります。
未テスト! YMMV。
refs/replace/
メカニズムを使用するとき、いくつかの大まかなコーナーに遭遇するかもしれないことに注意してください:それは新しい、そしてまだあまりよくテストされていない。
最後の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
それでもいくつかの行を修正して、作成者を変更したい場所を確認できます。これは自動化と制御の間の良い中間点をあなたに与えます:あなたは実行されるステップを見ます、そしてあなたが一度保存するとすべてが一度に適用されるでしょう。
修正したいコミットが最新のもので、そのうちの2つだけの場合は、git reset
とgit 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
あなたの問題は本当に一般的です。 「 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 <branch> <branch2>
レポに既存のユーザーを表示する
$ git changemail --show-both
ちなみに、変更を加えたら、filter-branchから次のようにしてバックアップを消去します。 git-backup-clean
著者名の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マシン上で再実行する必要がありました。
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
対話式リベースを使用して、変更したい各コミットの後に修正コマンドを配置できます。例えば:
pick a07cb86 Project tile template with full details and styling
x git commit --amend --reset-author -Chead
あなたがEGitと一緒にEclipseを使っているならば、それから非常に簡単な解決策があります。
仮定:あなたはローカルブランチ 'local_master_user_x'にコミットしていますが、無効なユーザーのためにリモートブランチ 'master'にプッシュすることはできません。
これを行う最も簡単で簡単な方法は、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
...
これはすべて自動的に機能します。これは、何百ものコミットがあるときに機能します。
あなたがこのリポジトリの唯一のユーザであるか、あるいは他のユーザのためにリポジトリを壊すことを気にしないのであれば、はい。あなたがこれらのコミットをプッシュし、他の場所からアクセスできる場所に存在するのであれば、他の人のリポジトリを壊すことを気にしないのでなければ、そうではありません。問題は、これらのコミットを変更することによって、新しいSHAを生成することになり、それによってそれらが異なるコミットとして扱われることになります。他の誰かがこれらの変更されたコミットを引き込もうとすると、歴史は異なり、kaboomです。
このページ http://inputvalidation.blogspot.com/2008/08/how-to-change-git-commit-author.html にその方法を説明しています。 (私はこれをやったことがないのでYMMV)
例も追加したい。与えられたパラメータで 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;
}
これを試してみてください。これは上記と同じですが、対話式に行われます。
bash <(curl -s https://raw.githubusercontent.com/majdarbash/git-author-change-script/master/run.sh)
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#を押してください(ループは最後のコミットを更新し続けます)