Как заставить тянуть перед толчком

Каждый раз, когда я хочу отправить свои коммиты (git commit -m "message", git push origin <branch>), я делаю извлечение (git pull origin <branch>).
Есть ли способ заставить git выполнять извлечение перед выполнением моего нажатия? (на той же ветке)


person Ali Farhoudi    schedule 13.09.2016    source источник
comment
вы можете создать псевдоним для этого - в файле конфигурации git добавьте [alias] mypush = !git pull -r && git push   -  person Divisadero    schedule 13.09.2016
comment
но я не знаю, стоит ли тебе это делать   -  person Divisadero    schedule 13.09.2016
comment
делаетAirExist && делаетДыхание   -  person Saurav Sahu    schedule 17.09.2016
comment
Каков контекст этой проблемы? Вы пытаетесь запустить это в сценарии или просто сохраняете интерактивный ввод в командной строке?   -  person merlin2011    schedule 21.09.2016
comment
@merlin2011 merlin2011 Если я зафиксирую изменение, не выполняя pull, а мой товарищ по команде внес некоторые изменения, мой код будет автоматически объединен с его кодом. Я не хочу, чтобы это произошло.   -  person Ali Farhoudi    schedule 21.09.2016
comment
См. мой ответ о том, как избежать фиксации слияния, которая обычно исходит от git pull.   -  person merlin2011    schedule 21.09.2016


Ответы (4)


В Git это можно сделать с помощью настройки хуков Git.

В вашем случае вам нужно будет перейти в каталог .git/hooks в вашем репозитории и добавить файл с именем pre-push, который является сценарием по вашему выбору, например. (баш в этом примере)

#!/bin/bash

echo "pulling ..."
git pull

Этот сценарий будет вызываться, когда вы делаете git push и перед фактической отправкой.

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

person creativeChips    schedule 21.09.2016
comment
Почему именно это очень наивный пример, т.е. что еще должен делать этот скрипт-ловушка помимо того, что в вашем ответе? - person Kenny Evitt; 18.02.2020
comment
это довольно старый ответ, но я думаю, что имел в виду, что может быть добавлена ​​логика для конкретного случая - условия, флаги и т. д. пример прост и в реальном мире, вероятно, будет более сложным (но это не обязательно) - person creativeChips; 20.02.2020

Судя по комментариям 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
person merlin2011    schedule 21.09.2016

На самом деле вам не нужно тянуть перед отправкой: если на удаленной стороне есть коммиты, которых у вас нет локально, 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 (как псевдоним)

person VonC    schedule 17.09.2016
comment
Благодарим Вас за оценку Это очень хорошо, но это не то, что я хотел. Должен быть шаг для фиксации и установки сообщения для моей фиксации. - person Ali Farhoudi; 21.09.2016
comment
@AliFarhoudi Вот почему я упоминаю в сценарии, что вы можете добавить любую команду, которую хотите. Это включает в себя любой шаг, который вам нужен. - person VonC; 21.09.2016

Если вы хотите, чтобы command2 выполнялась тогда и только тогда, когда command1 завершается успешно (обычно возвращает 0), запустите с двойным знаком амперсанда &&, зажатым между ними:

command1 && command2 

А чтобы запустить command2 после того, как command1 успешно или даже в случае неудачи, запустите с точкой с запятой ;:

command1 ; command2 

Я использовал первый для git pull && git push и более поздний для git pull ; date

person Saurav Sahu    schedule 17.09.2016
comment
Спасибо @saurav-sahu. Это полезно, но я хочу знать, есть ли способ, если я забыл pull и просто запустил push, он каким-то образом предупредит меня или запустит pull автоматически. В настоящее время он объединяет последнюю фиксацию других с моей фиксацией. - person Ali Farhoudi; 17.09.2016
comment
Хорошо .. Понятно .. Я проверю и дам вам знать ... Кстати, псевдонимы, разделенные пробелами, такие как git push, насколько мне известно, не поддерживаются. - person Saurav Sahu; 17.09.2016
comment
git push уже отклонит, если вы не в курсе последних обновлений пульта. Просто нажмите. Акт толкания спрашивает, можно ли толкать. Если есть причина, по которой вы не можете давить, вы не сможете давить. Тогда вы можете беспокоиться о том, что делать. - person Shaggy; 17.09.2016
comment
да, git push отклоняет код, но когда я вытягиваю после отклонения, коммит моего товарища по команде будет объединен с моим коммитом. - person Ali Farhoudi; 21.09.2016