Как задокументировано и обсуждаемый в другом месте, 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