Как задокументировано и обсуждаемый в другом месте, git fetch
отказывается получать текущую ветку, если вы не укажете параметр -u
.
Такое поведение имеет смысл в большинстве случаев и, очевидно, является правильным по умолчанию. Однако это не то поведение, которого я хочу. Вместо этого я хотел бы что-то вроде того, что делает опция конфигурации receive.denyCurrentBranch=updateInstead
: если текущее рабочее дерево и индекс совпадают с HEAD
, то разрешить выборку и обновление рабочего дерева; в противном случае откажитесь от выборки с аналогичным сообщением по умолчанию. Есть ли способ сделать это без написания моей собственной фарфоровой команды с помощью git fetch -u
?
Причина, по которой я хочу этого, в том случае, если доступен лучший рабочий процесс, заключается в том, что я работаю над рядом проектов, хранящихся в отдельных репозиториях Git. Большинство из них находится только в dev
локальной ветке, у которой dev/master
удаленная ветка является восходящей. Когда я на самом деле занимаюсь разработкой, я делаю это в ветке, названной в честь той функции, над которой я работаю, а не в ветке dev
. Я хочу, чтобы были доступны все удаленные ветки, поэтому мне нужно делать git fetch --all -p
регулярно, и мне дополнительно нужно делать git pull
в проектах, которые я не создаю, чтобы у них был последний код. Поскольку проектов много, самый простой способ - просто просмотреть их в цикле в Bash и запустить git fetch --all -p; git pull
на всех из них. К сожалению, это также работает git pull
в проектах, в которые я сейчас вносю изменения, и это может привести к конфликтам слияния вместо того, чтобы просто получить последние зависимости.
Вместо этого я хотел бы, чтобы у проектов, над которыми я сейчас не работаю, рабочее дерево обновлялось автоматически; то мне нужно только запустить git pull
в репозиториях, над которыми я сейчас работаю. Таким образом, я могу запускать его только тогда, когда это уместно, и не беспокоиться о конфликтах слияния, когда я просто хочу выполнить сборку с использованием последнего источника зависимых проектов.
git fetch
сам никогда не обновляет индекс и дерево работ. Думаю, вам, наверное, нужно написать здесь свой собственный фарфор. Обратите внимание, чтоgit-sh-setup
предоставляет способ проверить, чисты ли индекс и дерево работ (соответствуют фиксацииHEAD
), включая подмодули, без необходимости анализировать выводgit status
. Также обратите внимание, чтоgit pull
это простоgit fetch && git merge
, более или менее, поэтому вместоgit pull
вы можете протестировать, а затем, возможно, запуститьgit merge
. - person torek   schedule 01.06.2017git --exec-path
и посмотрите в полученном месте, вы найдетеstash
иfilter-branch
как примеры огромных сценариев оболочки. Я добавлю, что если вы напишете сценарий с именемgit-foo
и поместите его в любом месте вашего$PATH
,git foo
запустит ваш сценарий (с добавлениемgit --exec-path
перед$PATH
, чтобы вы могли. git-sh-setup
, например). - person torek   schedule 01.06.2017