Каждый раз, когда я хочу отправить свои коммиты (git commit -m "message"
, git push origin <branch>
), я делаю извлечение (git pull origin <branch>
).
Есть ли способ заставить git выполнять извлечение перед выполнением моего нажатия? (на той же ветке)
Как заставить тянуть перед толчком
Ответы (4)
В Git это можно сделать с помощью настройки хуков Git.
В вашем случае вам нужно будет перейти в каталог .git/hooks
в вашем репозитории и добавить файл с именем pre-push
, который является сценарием по вашему выбору, например. (баш в этом примере)
#!/bin/bash
echo "pulling ..."
git pull
Этот сценарий будет вызываться, когда вы делаете git push
и перед фактической отправкой.
Очевидно, это всего лишь очень наивный пример, но я надеюсь, что вы поняли идею. В этом каталоге уже есть образцы. Комментируйте, если что-то еще неясно.
Судя по комментариям OP, они, похоже, пытаются избежать фиксации слияния между их недавними фиксациями и фиксациями на удаленном компьютере, который обычно генерируется git pull
, когда локальная и удаленная истории расходятся.
Явный способ сделать это - сначала получить и перебазировать, а затем нажать.
git fetch
git rebase origin/master
git push
Второй способ сделать это — передать --rebase
при вызове git pull
.
git pull --rebase
Наконец, можно сделать это поведением по умолчанию для git pull
, настроив конфигурацию.
git config --global pull.rebase true
На самом деле вам не нужно тянуть перед отправкой: если на удаленной стороне есть коммиты, которых у вас нет локально, git push завершится ошибкой с сообщением:
Pushing to git@yourserver:<user>/<repo>.git
To git@yourserver:<user>/<repo>.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'https://github.com/BigMeanCat/CMDA'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
Если у вас есть контроль над удаленным сервером, вы можете установить там:
git config --system receive.denyNonFastForwards true
В более общем смысле вы можете легко определить псевдоним, объединяющий обе команды:
git config alias.pullpush '!git pull && git push'
Если тянуть не удается, нажатие не будет выполнено.
Наконец, вы можете комбинировать любую последовательность команд в сценарии bash с именем
git-pullpush
(без расширения, исполняемый файл, хранится в папке, на которую ссылается $PATH
)
Это будет обычный скрипт bash (который работает даже в Windows, так как он будет интерпретироваться msys bash)
#!/bin/bash
# you can add any command you want
git pull && git push
И вы бы назвали это git pullpush
(как псевдоним)
Если вы хотите, чтобы command2
выполнялась тогда и только тогда, когда command1
завершается успешно (обычно возвращает 0), запустите с двойным знаком амперсанда &&
, зажатым между ними:
command1 && command2
А чтобы запустить command2
после того, как command1
успешно или даже в случае неудачи, запустите с точкой с запятой ;
:
command1 ; command2
Я использовал первый для git pull && git push
и более поздний для git pull ; date
pull
и просто запустил push
, он каким-то образом предупредит меня или запустит pull
автоматически. В настоящее время он объединяет последнюю фиксацию других с моей фиксацией.
- person Ali Farhoudi; 17.09.2016
git push
, насколько мне известно, не поддерживаются.
- person Saurav Sahu; 17.09.2016
git push
уже отклонит, если вы не в курсе последних обновлений пульта. Просто нажмите. Акт толкания спрашивает, можно ли толкать. Если есть причина, по которой вы не можете давить, вы не сможете давить. Тогда вы можете беспокоиться о том, что делать.
- person Shaggy; 17.09.2016
git pull
. - person merlin2011   schedule 21.09.2016