2016-09-13 2 views
10

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

+6

вы можете создать псевдоним для этого - в конфигурационном файле мерзавца добавить [псевдоним] mypush = мерзавец тянуть -r && GIT толчок – Divisadero

+1

, но я не знаю, если вы должны сделать это – Divisadero

+0

doesAirExist && doBreathing –

ответ

9

Git способ сделать это с помощью customize Git hooks.

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

#!/bin/bash 

echo "pulling ..." 
git pull 

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

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

+0

Большое вам спасибо. Это лучший и разумный путь. –

+0

Спасибо @AliFarhoudi – creativeChips

2

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

command1 && command2 

И, запустить command2 после command1 успешно или даже если не удается, выполняется с использованием запятой ;:

command1 ; command2 

я использовал прежнюю для git pull && git push, а позже один для git pull ; date

+0

Спасибо @ saurav-sahu. Это полезно, но я хочу знать, есть ли какой-либо способ, если я забыл '' 'pull''' и просто запускал' '' push''', он как-то предупреждает меня или запускает '' 'pull''' автоматически. В настоящее время он объединяет последнее коммитирование других с моей фиксацией. –

+0

Ok..I see..I будет проверять и сообщать вам об этом. Кстати, псевдоним, связанный с пробелом, как 'git push', не поддерживается в соответствии с моими знаниями. –

+1

'git push' уже собирается отклонить, если вы не обновляетесь с пультом дистанционного управления. Просто нажмите. Акт толкания спрашивает, можно ли нажать. Если есть причина, по которой вы не можете нажать, вы не сможете нажать. Тогда вы можете беспокоиться о том, что делать. – Shaggy

2

Вы на самом деле не нужно тянуть до нажатия: если есть фиксации на удаленной стороне у вас нет на месте, мерзавец толчок будет завершаться сообщение сообщение:

Pushing to [email protected]:<user>/<repo>.git 
To [email protected]:<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 

В целом, вы можете easily define an alias combining both commands:

git config alias.pullpush '!git pull && git push' 

Если тянуть не удается, толчок не будет выполнен.


Наконец, вы можете комбинировать любую последовательность команд в Баш скрипт, не названный

git-pullpush 

(без расширения, исполняемый, хранящийся в папке, на которую ссылается $PATH)

Было бы быть обычным сценарием bash (который работает даже в Windows, поскольку он будет интерпретироваться в basys).

#!/bin/bash 
# you can add any command you want 
git pull && git push 

И вы могли бы назвать его git pullpush (как псевдоним)

+0

Спасибо VonC. Это очень хорошо, но это не то, что я хотел. Должен быть шаг для фиксации и установки сообщения для моего фиксации. –

+0

@AliFarhoudi Вот почему я упоминаю в сценарии «вы можете добавить любую команду, которую хотите». Это включает любой шаг, который вам нужен. – VonC

2

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

Явный способ сделать это - сначала извлечь и переустановить и, наконец, нажать.

git fetch 
git rebase origin/master 
git push 

Второй способ сделать это пройти --rebase при вызове git pull.

git pull --rebase 

Наконец, можно сделать такое поведение git pull по умолчанию, установив конфигурацию.

git config --global pull.rebase true