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

"git fetch -p" incorrectly deletes branches

From
RDReimar Döffinger <reimar.doeffinger@gmx.de>
Date
Jan 17, 2017, 06:04 UTC
Message-ID
<20170117060428.nanqz5lr4hi6dum6@reimardoeffinger.de>

Hello! The command: git fetch -p -v origin master:refs/heads/test

Deletes refs/heads/test every second time when run repeatedly:
$ git fetch -p -v origin master:refs/heads/test
From https://github.com/git/git
 * [new branch]          master     -> test
 = [up to date]          master     -> origin/master
$ git fetch -p -v origin master:refs/heads/test
From https://github.com/git/git
 - [deleted]             (none)     -> test
 = [up to date]          master     -> test
 = [up to date]          master     -> origin/master

(the command is the result of cutting down the test case, so yes it is rather silly, but the issue appears in much less obviously silly cases and causes a lot of confusion) This is specific to the case of specifying the origin branch without "full path" AND the right side with. Wild-guess on cause: "master" is auto-expanded into both "refs/tags/master" and "refs/heads/master" and instead of fetching either/merging the result, both are fetched. Combined with a time-of-check/time-of-use style race condition on the code that checks if a ref is "up to date" on top of it, it would result in this behaviour. Also note that this behaviour appears also when fetch.prune=yes is set in the config (instead of -p on the command-line), which makes it much less obvious and there is no option to turn of prune just for that command to work-around this. I hope someone has the time to make sure nobody else has to debug this ever again ;-)

Regards, Reimar Döffinger

Next: Jeff King
Message 1 of 2 in “"git fetch -p" incorrectly deletes branches”
  1. Reimar DöffingerJan 17, 2017
  2. Jeff KingJan 26, 2017

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.