From: Christopher Tiwald christiw...@gmail.com
To: Hilco Wijbenga hilco.wijbe...@gmail.com
Cc: Git Users git@vger.kernel.org
Bcc:
Subject: Re: On using receive.denyNonFastForwards and
advice.pushNonFastForward
Reply-To:
In-Reply-To:
cae1poi1m-fdmjtzw9mnl2r6zwvpxvwvo4ros_nscqtlmqb6...@mail.gmail.com
On Sun, Jul 08, 2012 at 02:26:50PM -0700, Hilco Wijbenga wrote:
I was wondering how hard it would be to make git push more adamant
about not pushing non-ff updates. So I wanted to see the effects of
receive.denyNonFastForwards and advice.pushNonFastForward. (By the
way, why is one plural and the other singular? That doesn't seem
consistent?)
'advice.pushNonFastForward' doesn't control whether or not
the remote accepts non-fast-forward updates. Rather, it controls whether
or not advice displays when 'git push' errors because the user attempted
a non-fast-forward update. As of 1.7.11 (f25950f3), it was supplemented
with 'advice.pushNonFFCurrent', 'advice.pushNonFFDefault', and
'pushNonFFMatching'. Setting the original 'advice.pushNonFastForward'
config option to 'false' will disable all three of these situational
hints. None of them will affect the actual operation of 'git push'.
As for this series of commands, none of these are non-fast-forward
updates (i.e. a situation where a pushed branch tip is behind its remote
counterpart):
HERE=$(pwd)
git init --bare remote-repo
cd remote-repo/
git config --add receive.denyNonFastForwards true
cd ..
git clone file://$HERE/remote-repo local-repo
cd local-repo/
git config --add advice.pushNonFastForward true
echo 1 one.txt
git add -A . git commit -m 1 git push origin master
This is the inital push to the remote:
$ git log --graph --oneline
* 32bbda2 1
$ git diff master origin/master ;# noop
git checkout -b next
echo a two.txt
git add -A . git commit -m 2
git checkout master
echo 2 one.txt
git add -A . git commit -m 3 git push origin master
This is a standard fast-forward update to the remote:
$ git log --graph --oneline
* 0176f87 3
* 32bbda2 1
$ git diff master origin/master ;# noop
git merge next
git push
This is also a standard fast-forward update to the remote:
$ git log --graph --oneline
* b881618 Merge branch 'next'
|\
| * 843a285 2
* | 0176f87 3
|/
* 32bbda2 1
$ git diff master origin/master ;# noop
If you want to see a true non-fast-forward error from this point, try
this:
git reset --hard HEAD~1
echo non-ff one.txt
git add . git commit -m 4 git push origin master
You should get something like this (the advice will change based on your
version of git):
[master cf28ce8] 4
1 file changed, 1 insertion(+), 1 deletion(-)
To /tmp/remote-repo
! [rejected]master - master (non-fast-forward)
error: failed to push some refs to '/tmp/remote-repo'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for
details.
The hint lines at the end are configured by the 'advice' options
described above.
--
Christopher Tiwald
--
To unsubscribe from this list: send the line unsubscribe git in
the body of a message to majord...@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html