Эквивалент update вместо git fetch -u

Как задокументировано и обсуждаемый в другом месте, 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 в репозиториях, над которыми я сейчас работаю. Таким образом, я могу запускать его только тогда, когда это уместно, и не беспокоиться о конфликтах слияния, когда я просто хочу выполнить сборку с использованием последнего источника зависимых проектов.


person Daniel H    schedule 01.06.2017    source источник
comment
git fetch сам никогда не обновляет индекс и дерево работ. Думаю, вам, наверное, нужно написать здесь свой собственный фарфор. Обратите внимание, что git-sh-setup предоставляет способ проверить, чисты ли индекс и дерево работ (соответствуют фиксации HEAD), включая подмодули, без необходимости анализировать вывод git status. Также обратите внимание, что git pull это просто git fetch && git merge, более или менее, поэтому вместо git pull вы можете протестировать, а затем, возможно, запустить git merge.   -  person torek    schedule 01.06.2017
comment
@torek На самом деле я раньше не писал свои собственные команды Git; есть ли где-нибудь хорошее руководство по этому поводу?   -  person Daniel H    schedule 01.06.2017
comment
Есть много плохих :-) Я не совсем уверен в хороших. Однако многие части Git написаны как сценарии оболочки. Запустите git --exec-path и посмотрите в полученном месте, вы найдете stash и filter-branch как примеры огромных сценариев оболочки. Я добавлю, что если вы напишете сценарий с именем git-foo и поместите его в любом месте вашего $PATH, git foo запустит ваш сценарий (с добавлением git --exec-path перед $PATH, чтобы вы могли . git-sh-setup, например).   -  person torek    schedule 01.06.2017


Ответы (2)


Кроме того, мне нужно сделать git pull в проектах, которые я не создаю, чтобы у них был последний код ... К сожалению, это также работает git pull в проектах, в которые я в настоящее время вношу изменения

Вы можете запустить git pull --ff-only, что немедленно завершится ошибкой, если есть какие-то локальные коммиты.

person max630    schedule 04.06.2017
comment
Я действительно должен был подумать об этом сам и не знаю, почему я этого не сделал. Он по-прежнему не делает именно то, что я просил, но он достаточно близок, и я думаю, что он делает то, что я действительно хочу. - person Daniel H; 05.06.2017
comment
Это было не так просто - по умолчанию я использую pull-with-rebase, потому что там, где я работаю, ожидается перебазирование, и мне нужно было добавить -c rebase.autoStash=no в командную строку, но теперь он работает именно так, как я хотел, и я могу сделать псевдоним, который выполняет выборку и это одновременно. - person Daniel H; 05.06.2017

Вы можете начать использовать git-хуки и запустить

git fetch -a

в любое время это необходимо

person sensorario    schedule 02.06.2017
comment
Кажется, что ни один из хуков не запускается при выборке, если только те, которые выполняются при удаленной отправке, также не запускаются при локальной выборке, но я нигде не вижу этого документированного. - person Daniel H; 02.06.2017