ラベル Git の投稿を表示しています。 すべての投稿を表示
ラベル Git の投稿を表示しています。 すべての投稿を表示

2012年6月10日日曜日

gitで名前やメールアドレスを置換する

毎回調べてしまうので自分用メモ。
git filter-branch --commit-filter '
if [ "$GIT_COMMITTER_NAME" = "【修正前の名前】" ]; then
    GIT_AUTHOR_NAME="【修正後のAUTHORの名前】"
    GIT_AUTHOR_EMAIL="【修正後のAUTHORのメールアドレス】"
    GIT_COMMITTER_NAME="【修正後のCOMMITTERの名前】"
    GIT_COMMITTER_EMAIL="【修正後のCOMMITTERのメールアドレス】"
fi
git commit-tree "$@"
' HEAD

2012年2月4日土曜日

gitで過去を改ざんする(5/5)


ではgit rebaseでガッと行きます。
変更を施す一つ前のリビジョンを指定。
$ git rebase -i 40e910ba
こんなのがエディタで開きます。
pick f1cf7c1 途中まで(早春賦)
pick a5bdfe7 誤字を修正
pick b3d4dfa 歌詞を最後まで(早春賦)
pick 20899eb 途中まで(椰子の実)
pick fe623a8 レイアウトを修正
pick 85767e2 歌詞を最後まで(椰子の実)
pick 94fba12 作詞者を追加(早春賦)
pick 16d9acd 作詞者を追加(椰子の実)

# Rebase 40e910b..16d9acd onto 40e910b
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
こんなふうに変更して保存します。
edit f1cf7c1 途中まで(早春賦)
fixup a5bdfe7 誤字を修正
edit b3d4dfa 歌詞を最後まで(早春賦)
edit 20899eb 途中まで(椰子の実)
fixup fe623a8 レイアウトを修正
edit 85767e2 歌詞を最後まで(椰子の実)
edit 94fba12 作詞者を追加(早春賦)
fixup 16d9acd 作詞者を追加(椰子の実)
(以下略)
詳細はコメントになっている部分を読んでください。
fixupとしているものは、その上の行に混ぜ込まれます。
editは、コミットログを書き換えるためです。

保存するとこんなメッセージが出てきます。
Stopped at f1cf7c1... 途中まで(早春賦)
You can amend the commit now, with

 git commit --amend

Once you are satisfied with your changes, run

 git rebase --continue

--amendでコミットログを書き換えます。
$ git commit --amend -m "早春賦を途中まで"
[detached HEAD 79526ef] 早春賦を途中まで
 1 files changed, 4 insertions(+), 0 deletions(-)
 create mode 100644 sousyunfu.txt
$
一旦終わったように見えますが、まだrebaseの途中です。
$ git rebase --continue
[detached HEAD 63992fe] 早春賦を途中まで
 1 files changed, 4 insertions(+), 0 deletions(-)
 create mode 100644 sousyunfu.txt
Stopped at b3d4dfa... 歌詞を最後まで(早春賦)
You can amend the commit now, with

 git commit --amend

Once you are satisfied with your changes, run

 git rebase --continue
同様にやっていきます。
$ git commit --amend -m "早春賦を最後まで"
$ git rebase --continue
$ git commit --amend -m "椰子の実を途中まで"
$ git rebase --continue
$ git commit --amend -m "椰子の実を最後まで"
$ git rebase --continue
$ git commit --amend -m "作詞者を追加"
$ git rebase --continue
一番最後にこう出ます。
Successfully rebased and updated refs/heads/work_3.
$



Eclipseで見てみると…
出来上がりです!
ORIG_HEADの枝はこの後mergeか何かすれば動いて消えるので、気にしなくてもOKです。



おっと、ブランチ名がwork_3では格好がつかない。
$ git branch -m work_3 master



完了。

gitで過去を改ざんする(4/5)


分割したので、次は結合していきます。
目的の形に結合しながら作っていく事もできますが、
まずcherry-pickを使ってまず並べ替えてしまう事にします。



スタートはこの状態。(3/5の最後の状態)
40e910ba「初期コミット」からbranchを作ります。
(0b291edf「途中まで(早春賦)」からでもいいですが)
$ git branch work_3 40e910ba
$ git checkout work_3



cherry-pickしていきます。
$ git cherry-pick 0b291edf
[work_3 f1cf7c1] 途中まで(早春賦)
 1 files changed, 4 insertions(+), 0 deletions(-)
 create mode 100644 sousyunfu.txt
こんなことになりますが気にせずcherry-pickしていきます。
$ git cherry-pick 36e6ca31
[work_3 a5bdfe7] 誤字を修正
 1 files changed, 1 insertions(+), 1 deletions(-)

$ git cherry-pick eccb4de3
[work_3 b3d4dfa] 歌詞を最後まで(早春賦)
 1 files changed, 2 insertions(+), 0 deletions(-)
途中経過。



「作詞者を追加」はおいておいて、椰子の実の方をcherry-pick。
$ git cherry-pick 8eb28748
[work_3 8e9bf2c] 途中まで(椰子の実)
 1 files changed, 4 insertions(+), 0 deletions(-)
 create mode 100644 yashinomi.txt

$ git cherry-pick dcf7a7f6
error: could not apply dcf7a7f... レイアウトを修正
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add ' or 'git rm '
hint: and commit the result with 'git commit'
おおっと。
椰子の実

<<<<<<< HEAD
名も知らぬ 遠き島より
流れ寄る 椰子の実一つ
=======
名も知らぬ遠き島より
流れ寄る椰子の実一つ
故郷の岸を離れて
汝はそも波に幾月
>>>>>>> dcf7a7f... レイアウトを修正
きちんと修正。
椰子の実

名も知らぬ遠き島より
流れ寄る椰子の実一つ
保存してaddしてcommit。
$ git add yashinomi.txt
$ git commit -m "レイアウトを修正"
[work_3 fe623a8] レイアウトを修正
 1 files changed, 2 insertions(+), 2 deletions(-)

$ git cherry-pick 17293681
error: could not apply 1729368... 歌詞を最後まで(椰子の実)
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add ' or 'git rm '
hint: and commit the result with 'git commit'
また失敗。
行の末尾に改行が入っていなかったのが問題だったかな。

直す。
椰子の実

名も知らぬ遠き島より
流れ寄る椰子の実一つ
故郷の岸を離れて
汝はそも波に幾月
addしてcommit。
$ git add yashinomi.txt
$ git commit -m "歌詞を最後まで(椰子の実)"
若干ゴタゴタしましたがこんな形に。



作詞者も追加。
$ git cherry-pick 667a4a79
$ git cherry-pick 670d4aff
こうなった。



確認。
$ git diff master
OK。
これで並べ替え完了。



要らないブランチを削除。
$ git branch -d work_1
$ git branch -d work_2
masterも一旦削除。
$ git branch -d master

少しゴニョゴニョしているのでORIG_HEADがうろうろしているのは無視してください。

つづく。

gitで過去を改ざんする(3/5)


次は「歌詞を最後までと作詞者を追加、を1ファイルずつにわけつつ歌詞と作詞者も別に」をやります。
基本的にやることは一緒ですが、歌詞の追加と作詞の追加を別コミットにするためにgit addで-pオプションを使います。



「歌詞を最後までと作詞者を追加」をwork_2ブランチとします。
$ git branch work_2 6c25eb04
$ git checkout work_2



同様にreset。
$ git reset 8eb28748
ORIG_HEADが移動した事で紐付けが無くなったブランチは非表示になりました。



ここで、git add を -pオプション付きで実行します。
$ git add -p sousyunfu.txt
diff --git a/sousyunfu.txt b/sousyunfu.txt
index bd56e50..6b6961a 100644
--- a/sousyunfu.txt
+++ b/sousyunfu.txt
@@ -1,4 +1,7 @@
 早春賦
+吉丸一昌
 
 春は名のみの 風邪の寒さや
 谷の鶯 歌は思えど
+時にあらずと 声も立てず
+時にあらずと 声も立てず
Stage this hunk [y,n,q,a,d,/,s,e,?]? 
この作詞者と歌詞の部分を分けたいので、sを入力します。
Stage this hunk [y,n,q,a,d,/,s,e,?]? s
Split into 2 hunks.
@@ -1,4 +1,5 @@
 早春賦
+吉丸一昌
 
 春は名のみの 風邪の寒さや
 谷の鶯 歌は思えど
Stage this hunk [y,n,q,a,d,/,j,J,g,e,?]? 
何となく先に歌詞の方をaddしたいので、nを入力します。
Stage this hunk [y,n,q,a,d,/,j,J,g,e,?]? n
@@ -2,3 +3,5 @@
 
 春は名のみの 風邪の寒さや
 谷の鶯 歌は思えど
+時にあらずと 声も立てず
+時にあらずと 声も立てず
Stage this hunk [y,n,q,a,d,/,K,g,e,?]? 
ここをaddしたいので、yを入力します。
Stage this hunk [y,n,q,a,d,/,K,g,e,?]? y

$



commitします。
$ git commit -m "歌詞を最後まで(早春賦)"
こうなります。

diffはこうなります。
歌詞の部分だけがコミットされました。



残りの作詞の部分をコミットします。
$ git add sousyunfu.txt
$ git commit -m "作詞者を追加(早春賦)"



もう一方も同様に。
$ git add -p yashinomi.txt
(略)
$ git commit -m "歌詞を最後まで(椰子の実)"
$ git add yashinomi.txt
$ git commit -m "作詞者を追加(椰子の実)"
こうなりました。



またrebaseします。
$ git checkout master
$ git rebase work_2

ひとまず分割は完了。

gitで過去を改ざんする(2/5)


まず今のヒストリーの中で、必要なところを分解したブランチを作成してみます。

分解する必要があるのは以下。
・途中まで、を1ファイルずつに
・歌詞を最後までと作詞者を追加、を1ファイルずつにわけつつ歌詞と作詞者も別に

やっていきましょう。

「途中まで」をwork_1ブランチに分割し、チェックアウト。
$ git branch work_1 e444489f
$ git checkout work_1
Eclipseの画面で見るとこんな状態。



git resetで、「『途中まで』のコミットをする直前の状態」に時間を巻き戻します。
$ git reset 40e910ba
Eclipseの画面で見るとこんな状態になります。
ディレクトリツリーはこうなって、ファイル追加前の状態になっています。
ファイルもこの通り「途中まで」の内容のままです。



一つずつコミットしていきます。
$ git add sousyunfu.txt
$ git commit -m "途中まで(早春賦)"
こんな状態になります。



もう1ファイルもコミット。
$ git add yashinomi.txt
$ git commit -m "途中まで(椰子の実)"
こうなりました。



この状態でe444489f「途中まで」と 8eb28748「途中まで(椰子の実)」は全く同じ内容になっているはずです。
確認方法はこう。
$ git diff e444489f 8eb28748
何も出なければ、差異なし。



さてここで、今のmasterを8eb28748「途中まで(椰子の実)」(=work_1)から959f5666「歌詞を最後までと作詞者を追加」に繋がった形にしてみます。
まずは今いる位置をwork_1からmasterに移動します。
$ git checkout master
こうなります。HEADがmasterの位置に来ます。



そして、git rebaseを実行。
$ git rebase work_1
First, rewinding head to replay your work on top of it...
Applying: 途中まで
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
No changes -- Patch already applied.
Applying: 歌詞を最後までと作詞者を追加
Applying: 誤字を修正
Applying: レイアウトを修正
$
これでこんな事になります。

つづく。

gitで過去を改ざんする(1/5)

過去を改ざんしてみる。

サンプルのリポジトリの初期状態はこんな感じ。


それぞれ状態はこんな感じ。
リビジョン(コメント)sousyunfu.txtyashinomi.txt
初期コミット
.projectファイル(特に意味はない)
途中まで
早春賦

春は名のみの 風邪の寒さや
谷の鶯 歌は思えど
椰子の実

名も知らぬ 遠き島より
流れ寄る 椰子の実一つ
歌詞を最後までと作詞者を追加
早春賦
吉丸一昌

春は名のみの 風邪の寒さや
谷の鶯 歌は思えど
時にあらずと 声も立てず
時にあらずと 声も立てず
椰子の実
島崎藤村

名も知らぬ 遠き島より
流れ寄る 椰子の実一つ
故郷の岸を離れて
汝はそも波に幾月
誤字を修正
早春賦
吉丸一昌

春は名のみの 風の寒さや
谷の鶯 歌は思えど
時にあらずと 声も立てず
時にあらずと 声も立てず
レイアウトを修正
椰子の実
島崎藤村

名も知らぬ遠き島より
流れ寄る椰子の実一つ
故郷の岸を離れて
汝はそも波に幾月

これを最終的にこんな風にしてみようと思います。
リビジョン(コメント)sousyunfu.txtyashinomi.txt
初期コミット
.projectファイル(特に意味はない)
早春賦を途中まで
早春賦

春は名のみの 風の寒さや
谷の鶯 歌は思えど
「途中まで」+「誤字を修正」
早春賦を最後まで
早春賦

春は名のみの 風の寒さや
谷の鶯 歌は思えど
時にあらずと 声も立てず
時にあらずと 声も立てず
「歌詞を最後までと作詞者を追加」+「誤字を修正」ー作詞者
椰子の実を途中まで
椰子の実

名も知らぬ遠き島より
流れ寄る椰子の実一つ
「途中まで」+「レイアウトを修正」
椰子の実を最後まで
椰子の実

名も知らぬ遠き島より
流れ寄る椰子の実一つ
故郷の岸を離れて
汝はそも波に幾月
「歌詞を最後までと作詞者を追加」+「レイアウトを修正」ー作詞者
作詞者を追加
早春賦
吉丸一昌

春は名のみの 風の寒さや
谷の鶯 歌は思えど
時にあらずと 声も立てず
時にあらずと 声も立てず
椰子の実
島崎藤村

名も知らぬ遠き島より
流れ寄る椰子の実一つ
故郷の岸を離れて
汝はそも波に幾月
作詞者を追加

続く。