web-dev-qa-db-ja.com

押す前に強制的に引く方法

コミットをプッシュしたいときはいつでも(git commit -m "message"git Push Origin <branch>)、プルします(git pull Origin <branch>)。
プッシュを実行する前にgitにプルを実行させる方法はありますか? (同じブランチ上)

16
Ali Farhoudi

これを行うGitの方法は、 Gitフックをカスタマイズする を使用することです。

あなたの場合、あなたはあなたのリポジトリの.git/hooksディレクトリに行き、あなたが選んだスクリプトであるpre-Pushという名前のファイルを追加する必要があるでしょう。 (この例ではbash)

#!/bin/bash

echo "pulling ..."
git pull

このスクリプトは、git Pushを実行したとき、実際のプッシュの前に呼び出されます。

明らかに、これは非常に単純なサンプルですが、あなたがその考えを理解してくれることを願っています。このディレクトリにはすでにサンプルがあります。それでも不明な点がある場合はコメントしてください。

14
creativeChips

OPのコメントに基づくと、最近のコミットとリモートでのコミットとの間のマージコミットを回避しようとしているようです。これは通常、ローカルとリモートの履歴が分岐したときにgit pullによって生成されます。

これを行う明示的な方法は、最初にフェッチしてリベースし、最後にプッシュすることです。

git fetch
git rebase Origin/master
git Push

これを行う2番目の方法は、--rebaseを呼び出すときにgit pullを渡すことです。

git pull --rebase

最後に、構成を設定することで、これをgit pullのデフォルトの動作にすることができます。

git config --global pull.rebase true
9
merlin2011

実際には、プッシュする前にプルする必要はありません。ローカルにないリモート側にコミットがある場合、gitPushは次のメッセージメッセージで失敗します。

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スクリプトになります(msys bashによって解釈されるため、Windowsでも機能します)

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

そして、あなたはそれをgit pullpush(エイリアスのように)で呼ぶでしょう

5
VonC

command2が成功した場合にのみcommand1を実行する場合(基本的に0)を返す場合は、ダブルアンパサンド記号&&を使用して実行します。

command1 && command2 

そして、command2が成功した後にcommand1を実行するにはまたは失敗した場合でも、セミコロン;を使用して実行します。

command1 ; command2 

前者をgit pull && git Pushに使用し、後者をgit pull ; dateに使用しました

3
Saurav Sahu