git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2 02/15] user-manual: Update for receive.denyCurrentBranch=refuse

From
Junio C Hamano <gitster@pobox.com>
Date
Feb 10, 2013, 21:24 UTC
Message-ID
<7vd2w7uajk.fsf@alter.siamese.dyndns.org>
In-Reply-To
<ba62167be6df7a6ba666373913bfd235bcc29c9d.1360508415.git.wking@tremily.us>
"W. Trevor King" <wking@tremily.us> writes:
Show 29 quoted lines
> From: "W. Trevor King" <wking@tremily.us>
>
> acd2a45 (Refuse updating the current branch in a non-bare repository
> via push, 2009-02-11) changed the default to refuse such a push, but
> it forgot to update the docs.
>
> 7d182f5 (Documentation: receive.denyCurrentBranch defaults to
> 'refuse', 2010-03-17) updated Documentation/config.txt, but forgot to
> update the user manual.
>
> Signed-off-by: W. Trevor King <wking@tremily.us>
> ---
>  Documentation/user-manual.txt | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/Documentation/user-manual.txt b/Documentation/user-manual.txt
> index 222545b..8524c08 100644
> --- a/Documentation/user-manual.txt
> +++ b/Documentation/user-manual.txt
> @@ -1988,8 +1988,10 @@ handling this case.
>  Note that the target of a "push" is normally a
>  <<def_bare_repository,bare>> repository.  You can also push to a
>  repository that has a checked-out working tree, but the working tree
> -will not be updated by the push.  This may lead to unexpected results if
> -the branch you push to is the currently checked-out branch!
> +will not be updated by the push.  To protect against this, pushes to
> +the currently checked-out branch of a repository are denied by
> +default.  See the description of the receive.denyCurrentBranch option
> +in linkgit:git-config[1] for details.

Nobody else felt the same logic gap between "will not be updated" and "to protect against this" I sensed while reading this?

I would not be surprised if some readers felt as if "then why not update it instead of rejecting?" were a valid question, without a bit more explanation.

	You can also push to a repository that has a working tree,
	but a push to the currently checked out branch is denied for
	two reasons:
        (1) if the push were allowed to update the working tree to
            match the pushed commit, it will overwrite and lose the
            work in progress in the working tree;
	(2) the push does _not_ update the working tree for the
	    above reason, but then if the push were allowed to
	    update the tip of the branch, the next commit made based
	    on the work done in the working tree will be based on
	    the state of the tree _before_ the push but will be
	    recorded as a descendant of the pushed commit, reverting
	    changes to the contents made by the pushed commit.
	
	If you want to handle the above two risks yourself (e.g. you
	can promise that you will never make changes to the files in
	the working tree or make commit from the working tree, and
	install a post-push hook that does "git reset --hard" to
	match the working tree state to the commit that was pushed),
	you can override this by setting receive.denyCurrentBranch.

It almost makes me wonder if it also makes sense to supersede the denyCurrentBranch setting with a new receive.currentBranch variable (setting it to "deny" is equivalent to setting denyCurrentBranch to true), and make "receive.currentBranch = reset" to allow a push and always run "git reset --hard" afterwards.

If we were to do so, I would strongly be against adding "checkout" mode that does "git reset --keep" instead of "--hard". Those who can accept the unconditional ovewriting with "reset --hard" are the only ones that are safe if "push" updated the tip of the branch and the working tree. Updating the working tree with a "reset --keep" may appear safe because it will catch the case where a file that needs updating by "push" is modified, but that is an incorrect assumption. It does not mean nobody has the contents in the editor buffer with changes yet to be written out. An automated update to the working tree condition has to be allowed only to a repository with nobody sitting at the keyboard editing files in there.

Previous: W. Trevor KingNext: W. Trevor King
Message 9 of 97 in “user-manual: Rewrite git-gc section for automatic packing”
  1. user-manual: Rewrite git-gc section for automatic packingW. Trevor King, Feb 8, 2013
  2. Junio C HamanoFeb 8, 2013
  3. W. Trevor KingFeb 8, 2013
  4. Junio C HamanoFeb 8, 2013
  5. Junio C HamanoFeb 8, 2013
  6. 00/15 User manual updatesW. Trevor King, Feb 10, 2013
  7. 01/15 user-manual: Rewrite git-gc section for automatic packingW. Trevor King, Feb 10, 2013
  8. 02/15 user-manual: Update for receive.denyCurrentBranch=refuseW. Trevor King, Feb 10, 2013
  9. Junio C HamanoFeb 10, 2013
  10. W. Trevor KingFeb 10, 2013
  11. Junio C HamanoFeb 10, 2013
  12. Junio C HamanoFeb 14, 2013
  13. W. Trevor KingFeb 17, 2013
  14. 0/9 User manual updatesW. Trevor King, Feb 18, 2013
  15. 1/9 user-manual: Use 'remote add' to setup push URLsW. Trevor King, Feb 18, 2013
  16. Junio C HamanoFeb 18, 2013
  17. Jonathan NiederFeb 18, 2013
  18. 2/9 user-manual: Reorganize the reroll sections, adding 'git rebase -i'W. Trevor King, Feb 18, 2013
  19. Junio C HamanoFeb 18, 2013
  20. W. Trevor KingFeb 18, 2013
  21. Junio C HamanoFeb 18, 2013
  22. 3/9 user-manual: Give 'git push -f' as an alternative to +masterW. Trevor King, Feb 18, 2013
  23. Junio C HamanoFeb 18, 2013
  24. 4/9 user-manual: Mention 'git remote add' for remote branch configW. Trevor King, Feb 18, 2013
  25. Junio C HamanoFeb 18, 2013
  26. W. Trevor KingFeb 18, 2013
  27. 5/9 user-manual: Standardize backtick quotingW. Trevor King, Feb 18, 2013
  28. user-manual: Standardize backtick quotingW. Trevor King, Feb 25, 2013
  29. 6/9 user-manual: Use 'git config --global user.*' for setupW. Trevor King, Feb 18, 2013
  30. Junio C HamanoFeb 18, 2013
  31. W. Trevor KingFeb 18, 2013
  32. 7/9 user-manual: Use request-pull to generate "please pull" textW. Trevor King, Feb 18, 2013
  33. Junio C HamanoFeb 18, 2013
  34. 8/9 user-manual: Flesh out uncommitted changes and submodule updatesW. Trevor King, Feb 18, 2013
  35. Junio C HamanoFeb 18, 2013
  36. W. Trevor KingFeb 19, 2013
  37. 9/9 user-manual: Use -o latest.tar.gz to create a gzipped tarballW. Trevor King, Feb 18, 2013
  38. Junio C HamanoFeb 18, 2013
  39. W. Trevor KingFeb 18, 2013
  40. Junio C HamanoFeb 18, 2013
  41. W. Trevor KingFeb 18, 2013
  42. W. Trevor KingFeb 19, 2013
  43. 0/3 User manual updatesW. Trevor King, Feb 19, 2013
  44. 1/3 user-manual: Reorganize the reroll sections, adding 'git rebase -i'W. Trevor King, Feb 19, 2013
  45. Junio C HamanoFeb 19, 2013
  46. W. Trevor KingFeb 19, 2013
  47. Junio C HamanoFeb 19, 2013
  48. user-manual: Fix the interactive rebase example commit rangeW. Trevor King, Mar 24, 2013
  49. Eric SunshineMar 24, 2013
  50. W. Trevor KingMar 24, 2013
  51. 2/3 user-manual: Use request-pull to generate "please pull" textW. Trevor King, Feb 19, 2013
  52. 3/3 user-manual: Flesh out uncommitted changes and submodule updatesW. Trevor King, Feb 19, 2013
  53. Drew NorthupFeb 18, 2013
  54. Junio C HamanoFeb 18, 2013
  55. 03/15 user-manual: Use 'remote add' to setup push URLsW. Trevor King, Feb 10, 2013
  56. Junio C HamanoFeb 10, 2013
  57. W. Trevor KingFeb 10, 2013
  58. Jonathan NiederFeb 10, 2013
  59. W. Trevor KingFeb 10, 2013
  60. Junio C HamanoFeb 10, 2013
  61. W. Trevor KingFeb 10, 2013
  62. 04/15 user-manual: Use git branch --mergedW. Trevor King, Feb 10, 2013
  63. Junio C HamanoFeb 10, 2013
  64. W. Trevor KingFeb 10, 2013
  65. 05/15 user-manual: Add a few references to 'git rebase -i'W. Trevor King, Feb 10, 2013
  66. Junio C HamanoFeb 10, 2013
  67. W. Trevor KingFeb 10, 2013
  68. 06/15 user-manual: Give 'git push -f' as an alternative to +masterW. Trevor King, Feb 10, 2013
  69. Junio C HamanoFeb 10, 2013
  70. W. Trevor KingFeb 10, 2013
  71. Junio C HamanoFeb 10, 2013
  72. 07/15 user-manual: Mention 'git remote add' for remote branch configW. Trevor King, Feb 10, 2013
  73. Junio C HamanoFeb 10, 2013
  74. Junio C HamanoFeb 10, 2013
  75. W. Trevor KingFeb 10, 2013
  76. 08/15 user-manual: Standardize backtick quotingW. Trevor King, Feb 10, 2013
  77. W. Trevor KingFeb 10, 2013
  78. 09/15 user-manual: Use 'git config --global user.*' for setupW. Trevor King, Feb 10, 2013
  79. Junio C HamanoFeb 10, 2013
  80. W. Trevor KingFeb 10, 2013
  81. Junio C HamanoFeb 10, 2013
  82. W. Trevor KingFeb 10, 2013
  83. 10/15 user-manual: Fix 'both: so' -> 'both; so' typoW. Trevor King, Feb 10, 2013
  84. 11/15 user-manual: Fix 'http' -> 'HTTP' typosW. Trevor King, Feb 10, 2013
  85. 12/15 user-manual: Use request-pull to generate "please pull" textW. Trevor King, Feb 10, 2013
  86. Junio C HamanoFeb 10, 2013
  87. W. Trevor KingFeb 10, 2013
  88. 13/15 user-manual: Fix 'you - Git' -> 'you--Git' typoW. Trevor King, Feb 10, 2013
  89. 14/15 user-manual: Flesh out uncommitted changes and submodule updatesW. Trevor King, Feb 10, 2013
  90. 15/15 user-manual: Use --format=tar.gz to create a gzipped tarballW. Trevor King, Feb 10, 2013
  91. Junio C HamanoFeb 10, 2013
  92. W. Trevor KingFeb 10, 2013
  93. Junio C HamanoFeb 10, 2013
  94. W. Trevor KingFeb 10, 2013
  95. Junio C HamanoFeb 10, 2013
  96. W. Trevor KingFeb 10, 2013
  97. Javier TiaFeb 9, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.