Gitでプルが必要かどうかを確認する


623

リモートリポジトリが変更され、プルする必要があるかどうかを確認するにはどうすればよいですか?

今、私はこの簡単なスクリプトを使用します:

git pull --dry-run | grep -q -v 'Already up-to-date.' && changed=1

しかし、それはかなり重いです。

もっと良い方法はありますか?理想的な解決策は、すべてのリモートブランチをチェックし、変更されたブランチの名前と各ブランチの新しいコミットの数を返すことです。


14
注意:「git pull --dry-run」はおそらく期待どおりに機能しません。git pullは不明なオプションを直接git fetchに渡しているようです。結果は、通常のgit pullの結果です。

27
「プル」は、「フェッチ」と「マージ」を同時に行うための短い方法にすぎません。リモートリポジトリのステータスを確認する必要がある場合は、「フェッチ」を実際にシミュレートしています。だからgit fetch -v --dry-runあなたが必要なものです。
Claudio Floreani 2013年

回答:


859

最初にを使用git remote updateして、リモート参照を最新の状態にします。その後、次のようないくつかのことを実行できます。

  1. git status -unoあなたが追跡しているブランチが前にあるのか、後ろにあるのか、分岐しているのかを教えてくれます。何も表示されない場合、ローカルとリモートは同じです。

  2. git show-branch *master名前が「master」で終わるすべてのブランチ(例:masterおよびorigin / master)のコミットが表示されます。

()-vと一緒に使用すると、更新されたブランチを確認できるため、それ以上コマンドを実行する必要はありません。git remote updategit remote -v update

ただし、スクリプトまたはプログラムでこれを実行し、true / false値で終了するように見えます。その場合は、現在のHEADコミットと追跡しているブランチのヘッドとの関係を確認する方法がありますが、4つの結果が考えられるため、はい/いいえの回答に減らすことはできません。ただし、準備ができているpull --rebase場合は、「ローカルが遅れている」と「ローカルが分岐している」を「プルする必要がある」、他の2つを「プルする必要がない」として扱うことができます。

を使用して任意の参照のコミットIDを取得できるため、マスターorigin / masterでgit rev-parse <ref>これを実行して、それらを比較できます。それらが等しい場合、ブランチは同じです。それらが等しくない場合は、どちらが先行しているかを知りたいです。を使用すると、両方のブランチの共通の祖先がわかります。分岐していない場合、これはどちらか一方と同じになります。3つの異なるIDを取得した場合、ブランチは分岐しています。git merge-base master origin/master

これをスクリプトなどで適切に行うには、現在のブランチと、それが追跡しているリモートブランチを参照できる必要があります。のbashプロンプト設定関数に/etc/bash_completion.dは、ブランチ名を取得するための便利なコードがいくつかあります。ただし、おそらく実際に名前を取得する必要はありません。Gitには、ブランチとコミットを参照するための簡潔な省略形があります(に記載されていますgit rev-parse --help)。特に、@現在のブランチ(分離ヘッド状態ではない場合)と@{u}その上流のブランチ(などorigin/master)に使用できます。だから、git merge-base @ @{u}(のハッシュ)は、現在のブランチとその上流発散れるコミットと戻りますgit rev-parse @と、git rev-parse @{u}次の2つのヒントのハッシュを与えるだろう。これは、次のスクリプトで要約できます。

#!/bin/sh

UPSTREAM=${1:-'@{u}'}
LOCAL=$(git rev-parse @)
REMOTE=$(git rev-parse "$UPSTREAM")
BASE=$(git merge-base @ "$UPSTREAM")

if [ $LOCAL = $REMOTE ]; then
    echo "Up-to-date"
elif [ $LOCAL = $BASE ]; then
    echo "Need to pull"
elif [ $REMOTE = $BASE ]; then
    echo "Need to push"
else
    echo "Diverged"
fi

注:古いバージョンのgitは@それ自体では許可されていないため、@{0}代わりに使用する必要があります。

この行でUPSTREAM=${1:-'@{u}'}は、現在のブランチに構成されているものとは異なるリモートブランチに対してチェックする場合に備えて、オプションで上流のブランチを明示的に渡すことができます。これは通常、remotename / branchnameの形式になります。パラメータを指定しない場合、値はデフォルトでになり@{u}ます。

このスクリプトでは、追跡ブランチを最新の状態にするために、git fetchまたはgit remote update最初に完了したと想定しています。これをスクリプトに組み込んだのは、フェッチと比較を個別の操作として実行できるため、たとえば最近フェッチしたためフェッチせずに比較したい場合など、より柔軟であるためです。


4
@takeshin @broolによって提案されたgit ls-remote origin -h refs / heads / masterをgit rev-list --max-count = 1 origin / masterと組み合わせることができると思います。それらが同じハッシュを返す場合、リモートブランチは、リモート参照を最後に更新してから変更されていません(プル、フェッチ、リモート更新などで)。これには、コンテンツをプルダウンする必要がないという利点があります。すべてのコミットはすぐに行われますが、より便利な時間にそれを残すことができます。ただし、リモート更新は非破壊的であるため、とにかくそうすることもできます。
Neil Mayhew、

2
またgit status -s -u no、を試してみることもできgit status -u noます。
Phillip Cloud、

2
@mhulse 、git remote -v update. git remote --help詳細な説明については、の出力をご覧ください。
Neil Mayhew

1
@ChrisMaes良い点。古いバージョンのgitでは、より明示的な構文が必要です。私はさまざまなシステムを試してみましたが@{u}、git 1.8.3.2では@動作しますが、動作しません。ただし、で@動作し1.8.5.4ます。話の教訓:gitは改善を続けており、できる限り最新のバージョンを入手する価値があります。
Neil Mayhew 2014

1
@には指定子が必要になりました。@の代わりに@ {0}を使用できます。
ベンデイビス

132

上流ブランチがある場合

git fetch <remote>
git status

上流のブランチがない場合

2つのブランチを比較します。

git fetch <remote>
git log <local_branch_name>..<remote_branch_name> --oneline

例えば:

git fetch origin

# See if there are any incoming changes
git log HEAD..origin/master --oneline

(私origin/masterはあなたのリモート追跡ブランチであると仮定しています)

上記の出力にコミットがリストされている場合は、着信変更があります-マージする必要があります。コミットがリストされていない場合、git logマージするものはありません。

Gitが記憶しorigin/masterている上流のブランチを暗黙的に使用する代わりに明示的に参照する場合、追跡リモートがない機能ブランチにいる場合でも、これは機能することに注意してください。


2
git fetch; git log HEAD.. --onelineローカルブランチにデフォルトのリモートブランチがある場合は、短い表記でも使用できます。
phil pirozhkov

@philpirozhkovデフォルトのリモートブランチがある場合、単純な「git status」で十分だと思います。私の答えは、任意の2つのブランチに対する一般的なものでした。
PlagueHammer、2012年

55
git rev-list HEAD...origin/master --count2つの間の「異なる」コミットの総数が表示されます。
Jake Berger

1
短くてシンプル。新しいコミットを表示するだけの私のお気に入りのソリューション(2回親指を立てる)
spankmaster79 2014年

(Ubuntu)バッチファイルでこれを使用して、プルが必要であることをこのコマンドが示している場合にのみ他のコマンドを実行できるようにするにはどうすればよいですか?
Ulysses Alves 2016年

69

これがスクリプトの場合は、次を使用できます。

git fetch
$(git rev-parse HEAD) == $(git rev-parse @{u})

(注:これに対する以前の回答の利点は、現在のブランチ名を取得するために別のコマンドを必要としないことです。 "HEAD"と "@ {u}"(現在のブランチの上流)がそれを処理します。詳細については、「git rev-parse --help」をご覧ください)。


私は独自に@ {u}を発見し、あなたの答えを見る前に私の答えを更新しました。
Neil Mayhew 14年

1
ウィルgit rev-parse @{u}実際に最新のがなくてコミットを示してgit fetch
カイルストランド

3
これがチケットでした!ただし、ロジック==では「上流からの変更がない場合」を使用しています。!=私のアプリケーションでは、「アップストリームからの変更があるかどうか」を確認するために使用していました。git fetchまずはお忘れなく!
ChrisPrime 2015年

1
元の質問に答える必要があるので、git fetchを追加しました。@HEADbtwの略です。
user1338062

Windowsユーザーは、@{u}egの前後に単一引用符が必要になりますgit rev-parse '@{u}'
spuder

36

コマンド

git ls-remote origin -h refs/heads/master

リモートの現在のヘッドが一覧表示されます。これを以前の値と比較するか、ローカルリポジトリにSHAがあるかどうかを確認できます。


1
これらの値を比較するサンプルスクリプトはありますか?
takeshin

18
git rev-list HEAD...origin/master --count2つの間の「異なる」コミットの総数が表示されます。
Jake Berger

3
@jbergerは明確にします、それはあなたが遅れているコミットの数だけを示します(前後ではなく)、それはあなたgit fetchまたはgit remote update最初の場合にのみ機能します。git statusカウントも表示されます。
デニス

1
@Dennis ..は「起源/マスターでのコミット、HEADを差し引いたもの」(つまり、遅れているコミットの数)だと思いました。、一方...対称差(すなわち前後に)
ジェイク・ベルガー

3
優秀な。私の知る限り、これは実際に更新の発生元をチェックする唯一のソリューションですが、暗黙的にを行いませんfetch
カイルストランド14

35

以下は、現在のブランチのHEADコミットハッシュをリモートの上流ブランチと比較するBashワンライナーです。重いものgit fetchgit pull --dry-run操作は必要ありません。

[ $(git rev-parse HEAD) = $(git ls-remote $(git rev-parse --abbrev-ref @{u} | \
sed 's/\// /g') | cut -f1) ] && echo up to date || echo not up to date

このやや密度の高い線を分解する方法を次に示します。

  • コマンドはグループ化され、$(x)Bash コマンド置換構文を使用してネストされます。
  • git rev-parse --abbrev-ref @{u}省略されたアップストリーム参照(例:)を返しますorigin/master。これは、パイプで連結されたsedコマンド(例:)によってスペースで区切られたフィールドに変換されますorigin master
  • この文字列はgit ls-remote、リモートブランチのヘッドコミットを返すために供給されます。このコマンドは、リモートリポジトリと通信します。パイプcutコマンドは、最初のフィールド(コミットハッシュ)のみを抽出し、タブ区切りの参照文字列を削除します。
  • git rev-parse HEAD ローカルコミットハッシュを返します。
  • Bash構文[ a = b ] && x || yは1行を完了します。これは、テストコンストラクト内のBash 文字列比較 =であり[ test ]、その後にand-listおよびor-listコンストラクトが続き&& true || falseます。

2
私は考えていないあなたはブランチ名にスラッシュを使用している場合sedの上/ gを使用しています。それは「sedの/ \ // /」だけです。
Martyn Davis

@wjordanリモートリポジトリに到達できない場合(またはメンテナンス中)にソリューションが失敗し、「最新の状態」がトリガーされます
フレーム

20

スクリプトhttps://github.com/badele/gitcheckをご覧になることをお勧めします。すべてのGitリポジトリを一度にチェックインするためにこのスクリプトをコーディングしました。誰がコミットしておらず、誰がプッシュ/プルしていないかを示しています。

ここにサンプルの結果:

ここに画像の説明を入力してください


6
きちんとした、純粋なシェルでそれを書き直すことを考える
Olivier Refalo

1
これで、Dockerコンテナーから直接gitcheckを使用することもできます(ホストにファイルを格納)。詳細については、gitcheck githubプロジェクトを参照してください
BrunoAdelé15年

bash git-multi-repo-toolingの同様のツール。 git mrepo -c保留中のコミットがすべて表示されます。
グレッグ

11

このソリューションは、@ jbergerのコメントに基づいています。

if git checkout master &&
    git fetch origin master &&
    [ `git rev-list HEAD...origin/master --count` != 0 ] &&
    git merge origin/master
then
    echo 'Updated!'
else
    echo 'Not updated.'
fi

以前のコメントを参考にして、現時点では明確な回答はできません。私がそれらのコメントをしたとき、私はgitの深さ、特にリモートとdiffに飛び込んでいました。それから数か月が経ち、その知識の多くは私の脳の中に埋もれています。;)2つの「異なる」コミットの数を探している場合...、ソリューションの有効な部分のようです。
ジェイクバーガー2013年

1
ありがとう。これはきれいでした。
Shobhit Puri

10

多くの非常に機能豊富で独創的な答えがすでにあります。対照的に、非常に単純な線で間に合わせることができます。

# Check return value to see if there are incoming updates.
if ! git diff --quiet remotes/origin/HEAD; then
 # pull or whatever you want to do
fi

2
元の答えには「!」が欠けていました の場合。変更がない場合、git diffからの戻り値はゼロです。
thuovila

IMOの最善の解決策はありますが、「remotes / origin / HEAD」を「origin / master」またはその他のリビジョンに置き換える必要があります
Matthias Michael Engh

9

これを行う最善の方法は次のようになると思います。

git diff remotes/origin/HEAD

this refspecが登録されていると仮定します。リポジトリのクローンを作成した場合は、それ以外の場合(つまり、リポジトリがde novoでローカルに作成され、リモートにプッシュされた場合)、refspecを明示的に追加する必要があります。


9

以下のスクリプトは完全に機能します。

changed=0
git remote update && git status -uno | grep -q 'Your branch is behind' && changed=1
if [ $changed = 1 ]; then
    git pull
    echo "Updated successfully";
else
    echo "Up-to-date"
fi

6

私はbroolによって提案された方法を行います。次の1行のスクリプトは、最後にコミットされたバージョンのSHA1を取得し、それをリモートオリジンのSHA1と比較して、変更が異なる場合のみプルします。また、git pullまたはに基づくソリューションのさらに軽量なものですgit fetch

[ `git log --pretty=%H ...refs/heads/master^` != `git ls-remote origin
-h refs/heads/master |cut -f1` ] && git pull

gitリポジトリが "--depth 1"(ダウンロードサイズを制限するため)で複製されている場合、このコマンドは失敗します。それを修正する方法があるかどうか知っていますか?
Adam Ryczkowski、2014年

「:[:あまりにも多くの引数のbash」私はに切り替えたいgitが、これは多くの行を返し、エラーを与えているログgit rev-parse --verify HEAD
ドリューピアース

1
これは、bashによって実行される単純な文字列比較です。何かが失敗した場合は、構文を確認することをお勧めします(つまり、入力を間違えています)。最初に実行 git log --pretty=%H ...refs/heads/master^ して、最後にコミットしたバージョンgit ls-remote origin -h refs/heads/master |cut -f1 のSHA1を取得し、次に実行 してリモートオリジンのSHA1を取得します。これら2つはgitコマンドであり、bashとは関係ありません。角括弧内でbashが行うのは、最初のコマンドの出力と2番目のコマンドの出力を比較することです。それらが等しい場合は、trueを返し、を実行しgit pullます。
Claudio Floreani 2014年

「それらが等しい場合、trueを返し、実行しますgit pull。」私はつらい思いをしているのはわかっていますが、誰かの混乱を避けるために、それは「そして彼ら等しくなければ」であるべきです。また、何らかの理由で、最初のgitコマンドは機能しません。(私はgitを使用してい2.4.1ます。)したがって、git log --pretty=%H master | head -n1代わりに使用しています。しかし、それがまったく同じかどうかはわかりません。
xd1le 2015年

6

このスクリプトを実行すると、現在のブランチに次のものが必要かどうかがテストされますgit pull

#!/bin/bash

git fetch -v --dry-run 2>&1 |
    grep -qE "\[up\s+to\s+date\]\s+$(
        git branch 2>/dev/null |
           sed -n '/^\*/s/^\* //p' |
                sed -r 's:(\+|\*|\$):\\\1:g'
    )\s+" || {
        echo >&2 "Current branch need a 'git pull' before commit"
        exit 1
}

回避するためにGitフックのプリコミットとして配置すると非常に便利です。

Merge branch 'foobar' of url:/path/to/git/foobar into foobar

あなたがcommit前にpulling

このコードをフックとして使用するには、スクリプトを次の場所にコピーして貼り付けます。

.git/hooks/pre-commit

そして

chmod +x .git/hooks/pre-commit

6

コメントで見落としやすいので、実際の投稿として投稿したいだけです。

この質問に対する正しい、最良の回答は@Jake Bergerによって与えられました。したがって、これで苦労しているすべての人にとって正しい答えは、このコマンドの出力を使用して、git pullを実行する必要があるかどうかを知ることです。出力が0の場合、明らかに更新するものはありません。

@stackoverflow、この男にベルを与えてください。ありがとう@ジェイクバーガー

git rev-list HEAD...origin/master --count will give you the total number of "different" commits between the two.  Jake Berger Feb 5 '13 at 19:23

4

実行git fetch (remote)してリモート参照を更新すると、新機能が表示されます。次に、ローカルブランチをチェックアウトすると、上流に遅れているかどうかが表示されます。


彼はすでにローカルブランチをチェックアウトしていると思うので、遅れているかどうかを示すために何か他のものが必要です。彼はgit statusでこれを行うことができます。
Neil Mayhew 2010

確かに、リモートをフェッチgit statusすると、それも表示されます。
CHE

1
それは気分でgit pull --dry-run行うことですが、毎分実行されるcronスクリプトにとって重すぎると思います。
takeshin 2010

@takeshin:ネットワークに接続せずにリモートリポジトリをチェックすることはできません。新しいものがない場合はfetch、ステータスを確認する以外に何もしません。リモート更新に対して非常に高速で軽量な対応が必要な場合は、リモートリポジトリになんらかの通知をフックすることを検討してください。
CHE

@takeshin:毎分リモートリポジトリをチェックしたい場合は、DVCSのポイントを逃したと思います。全体のアイデアは、しばらくの間独立して開発し、後ですべてをスムーズにまとめられるようにすることです。cvs、svn、p4などとは異なり、常にリポジトリ内の最新のものの上で作業する必要があります。他の誰かが取り組んでいる何かが本当に必要な場合は、電子メールなどの別の通信メカニズムを使用して、プルする準備ができたことを通知する必要があります。
Neil Mayhew 2010

4

ソリューションが非常に短く簡単である一方で、このような複雑な提案はすべて次のようになります。

#!/bin/bash

BRANCH="<your branch name>"
LAST_UPDATE=`git show --no-notes --format=format:"%H" $BRANCH | head -n 1`
LAST_COMMIT=`git show --no-notes --format=format:"%H" origin/$BRANCH | head -n 1`

git remote update
if [ $LAST_COMMIT != $LAST_UPDATE ]; then
        echo "Updating your branch $BRANCH"
        git pull --no-edit
else
        echo "No updates available"
fi

LAST_COMMITとLAST_UPDATEは、変更があったとしても常に同じです
canbax

このソリューションは優れており、シンプルgit remote updateです。最新のオリジンコミット情報を取得するには、コードの前にputを実行する必要があります
ak93

コマンドのgit remote update前に追加すべきではありませんgit showか?
Setop

2

以下は、事前定義されたフォルダ内のすべてのリポジトリをチェックするBashスクリプトの私のバージョンです。

https://gist.github.com/henryiii/5841984

プルが必要な場合とプッシュが必要な場合など、一般的な状況を区別できます。また、マルチスレッドであるため、フェッチはすべて一度に行われます。プルやステータスなど、いくつかのコマンドがあります。

パス内のフォルダーにシンボリックリンク(またはスクリプト)を配置すると、git all status(など)として機能します。オリジン/マスターのみをサポートしますが、編集したり、別の方法と組み合わせたりできます。


1
git ls-remote | cut -f1 | git cat-file --batch-check >&-

リポジトリにないリモートで参照されているすべてをリストします。すでに持っているものへのリモートrefの変更(たとえば、以前のコミットへのリセット)をキャッチするには、もう少し時間がかかります。

git pack-refs --all
mine=`mktemp`
sed '/^#/d;/^^/{G;s/.\(.*\)\n.* \(.*\)/\1 \2^{}/;};h' .git/packed-refs | sort -k2 >$mine
for r in `git remote`; do 
    echo Checking $r ...
    git ls-remote $r | sort -k2 | diff -b - $mine | grep ^\<
done

1

タスクをcrontabとして追加したい場合、これはおそらく:

#!/bin/bash
dir="/path/to/root"
lock=/tmp/update.lock
msglog="/var/log/update.log"

log()
{
        echo "$(date) ${1:-missing}" >> $msglog
}

if [ -f $lock ]; then
        log "Already run, exiting..."
else
        > $lock
        git -C ~/$dir remote update &> /dev/null
        checkgit=`git -C ~/$dir status`
        if [[ ! "$checkgit" =~ "Your branch is up-to-date" ]]; then
                log "-------------- Update ---------------"
                git -C ~/$dir pull &>> $msglog
                log "-------------------------------------"
        fi
        rm $lock

fi
exit 0

1

単純な正規表現を使用する:

str=$(git status) 
if [[ $str =~ .*Your\ branch\ is\ behind.*by.*commits,\ and\ can\ be\ fast-forwarded ]]; then
    echo `date "+%Y-%m-%d %H:%M:%S"` "Needs pull"
else
    echo "Code is up to date"
fi

これは機能しません。git statusはローカルチェックにすぎないため、リモートのdefをすでに更新している場合にのみ、ブランチが遅れているかどうかを通知します。
minhaz1 2018年

0

私はスティーブンハーバーマンの回答に基づいたスクリプトのバージョンを使用します。

if [ -n "$1" ]; then
    gitbin="git -C $1"
else
    gitbin="git"
fi

# Fetches from all the remotes, although --all can be replaced with origin
$gitbin fetch --all
if [ $($gitbin rev-parse HEAD) != $($gitbin rev-parse @{u}) ]; then
    $gitbin rebase @{u} --preserve-merges
fi

このスクリプトがと呼ばgit-fetch-and-rebaseれている場合、オプションの引数で呼び出すことができますdirectory name、ローカルGitリポジトリーの操作を実行できます。スクリプトが引数なしで呼び出された場合、現在のディレクトリがGitリポジトリの一部であると想定されます。

例:

# Operates on /abc/def/my-git-repo-dir
git-fetch-and-rebase /abc/def/my-git-repo-dir

# Operates on the Git repository which the current working directory is part of
git-fetch-and-rebase

こちらからもご利用いただけます


0

多くの回答と複数の投稿を読み、半日かけてさまざまな順列を試した後、これが私が思いついたものです。

Windowsを使用している場合は、Git for Windows(インストールまたはポータブル)が提供するGit Bashを使用して、このスクリプトをWindowsで実行できます。

このスクリプトには引数が必要です

-ローカルパス例/ d / source / project1
-Git URL例:https://username@bitbucket.org/username/project1.git
-パスワード

コマンドラインにプレーンテキストでパスワードを入力しない場合は、
次に、スクリプトを変更してGITPASSが空かどうかを確認します。しない
置き換えて、Gitにパスワードの入力を求める

スクリプトは

- Find the current branch
- Get the SHA1 of the remote on that branch
- Get the SHA1 of the local on that branch
- Compare them.

スクリプトによって出力された変更がある場合は、フェッチまたはプルに進むことができます。スクリプトは効率的ではないかもしれませんが、私のために仕事をしてくれます。

アップデート-2015-10-30:コンソールへのパスワード付きのURLの印刷を防ぐためのdev nullへのstderr。

#!/bin/bash

# Shell script to check if a Git pull is required.

LOCALPATH=$1
GITURL=$2
GITPASS=$3

cd $LOCALPATH
BRANCH="$(git rev-parse --abbrev-ref HEAD)"

echo
echo git url = $GITURL
echo branch = $BRANCH

# Bash replace - replace @ with :password@ in the GIT URL
GITURL2="${GITURL/@/:$GITPASS@}"
FOO="$(git ls-remote $GITURL2 -h $BRANCH 2> /dev/null)"
if [ "$?" != "0" ]; then
  echo cannot get remote status
  exit 2
fi
FOO_ARRAY=($FOO)
BAR=${FOO_ARRAY[0]}
echo [$BAR]

LOCALBAR="$(git rev-parse HEAD)"
echo [$LOCALBAR]
echo

if [ "$BAR" == "$LOCALBAR" ]; then
  #read -t10 -n1 -r -p 'Press any key in the next ten seconds...' key
  echo No changes
  exit 0
else
  #read -t10 -n1 -r -p 'Press any key in the next ten seconds...' key
  #echo pressed $key
  echo There are changes between local and remote repositories.
  exit 1
fi

0

この質問でこれを探しているWindowsユーザーのために、私は答えの一部をpowershellスクリプトに変更しました。必要に応じて調整し、.ps1ファイルに保存して、オンデマンドで実行するか、必要に応じてスケジュールします。

cd C:\<path to repo>
git remote update                           #update remote
$msg = git remote show origin               #capture status
$update = $msg -like '*local out of date*'
if($update.length -gt 0){                   #if local needs update
    Write-Host ('needs update')
    git pull
    git reset --hard origin/master
    Write-Host ('local updated')
} else {
    Write-Host ('no update needed')
}

0

Neilsの回答が私を助けてくれたので、依存関係のないPython翻訳があります:

import os
import logging
import subprocess

def check_for_updates(directory:str) -> None:
    """Check git repo state in respect to remote"""
    git_cmd = lambda cmd: subprocess.run(
        ["git"] + cmd,
        cwd=directory,
        stdout=subprocess.PIPE,
        check=True,
        universal_newlines=True).stdout.rstrip("\n")

    origin = git_cmd(["config", "--get", "remote.origin.url"])
    logging.debug("Git repo origin: %r", origin)
    for line in git_cmd(["fetch"]):
        logging.debug(line)
    local_sha = git_cmd(["rev-parse", "@"])
    remote_sha = git_cmd(["rev-parse", "@{u}"])
    base_sha = git_cmd(["merge-base", "@", "@{u}"])
    if local_sha == remote_sha:
        logging.info("Repo is up to date")
    elif local_sha == base_sha:
        logging.info("You need to pull")
    elif remote_sha == base_sha:
        logging.info("You need to push")
    else:
        logging.info("Diverged")

check_for_updates(os.path.dirname(__file__))

hth


-5

今それを行うPhingスクリプトも見つけることができます。

運用環境を自動的に更新するソリューションが必要でしたが、共有しているこのスクリプトのおかげでとても満足しています。

スクリプトはXMLで記述されており、Phingが必要です


ここにスクリプトをコピーして貼り付けるのは良い考えではないかもしれません。まだ更新中です...
Pol Dellaiera
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.