Gitでfilter-branchを使って歴史の書換えを行った後で、
push -f
してみるとエラーでrejectされてしまいました。
-fオプションはForce(強制)
のはずなのでなんでなんだろう?
git push -f でnon-fast-forwardエラー
git pushすると以下のエラーが出ました。
1 2 3 4 5 6 7 |
To /aaa/bbb/repo.git/ ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to '/aaa/bbb/repo.git/' hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Integrate the remote changes (e.g. hint: 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details. |
やむを得ず、git push -f を試みます。
(今考えてみれば、何も考えずに、-f するのは危険というか、浅はか。)
1 2 3 4 5 6 7 |
Counting objects: 1, done. Writing objects: 100% (1/1), xxx bytes | 0 bytes/s, done. Total 1 (delta 0), reused 0 (delta 0) remote: error: denying non-fast-forward refs/heads/master (you should pull first) To /aaa/bbb/repo.git/ ! [remote rejected] master -> master (non-fast-forward) error: failed to push some refs to '/aaa/bbb/repo.git/' |
やはりエラーです。
うーん。
denyNonFastForwardsをtrueからfalseへ変更
リポジトリの
/aaa/bbb/repo.git/config
を調べてみると以下のようになっていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[core] repositoryformatversion = 0 filemode = true bare = true logallrefupdates = true compression = -1 sharedRepository = group [remote "origin"] url = /root/work/repo.git fetch = +refs/heads/*:refs/remotes/origin/* [branch "master"] remote = origin merge = refs/heads/master [receive] denyNonFastForwards = true |
denyNonFastForwards = true
にすると、
non-fast-forwards
なコミットは拒否されます。
git init --bare --shared
でリポジトリを作成するとこのような設定になるようです。
今回は、リポジトリのconfigの中身を
denyNonFastForwards = false
に修正しました。
ちなみに、コマンドからは以下のようにします。
1 |
# git config receive.denyNonFastForwards false |
まとめ
まとめると以下の通りです。
denyNonFastForwards = true
filter-branchで歴史の書換えが出来なくなる。
denyNonFastForwards = false
filter-branchで歴史の書き換えを行える。
運用方法としては都合の良いほうを使えばよいと思います。
Gitについてのおすすめの本
↓Gitについてのおすすめの本はコチラ
コメント