2017-11-13 8 views
2

更新がある場合、git repoをチェックしようとしています。 私は私のUbuntuサーバにログインしたときにこれを実行する必要があるので、私は、私はそれが私にcdになっている、次のBashログイン時にGitのアップデートを確認する

で/etc/update-motd.d/90-updates-availableスクリプトを変更すると考えましたレポが見つかるとそれをレポし、それをリモートレポと比較します。リモートが新しい場合は通知を印刷します。私は、マシンへのログイン上にある、どんな..見つけることないのです何

#!/bin/sh 

stamp="/var/lib/update-notifier/updates-available" 

[ ! -r "$stamp" ] || cat "$stamp" 

cd $(find/-wholename '*-Commander*/.git' | xargs -n 1 dirname) 

UPSTREAM=${1:-'@{u}'} 
LOCAL=$(git rev-parse @) 
REMOTE=$(git rev-parse "$UPSTREAM") 
BASE=$(git merge-base @ "$UPSTREAM") 
echo "----------------------------------------------------------" 
echo "" 
if [ $LOCAL = $BASE ]; then 
    echo "Repo Need to be Updated" 
    MEM=$(free -m | grep -oP '\d+' | head -n 1); 
    if [ $MEM -lt 2048 ]; then 
     echo "Low Mem Check" 
    fi; 
fi; 
echo "" 
echo "----------------------------------------------------------" 

が、それはまだそれが最新のものである場合でも、Repo Need to be Updated示しています。

レポはsudoerとして取得されましたが、マシンにログインすると最初は通常のユーザーとしてログインします。

私は間違っていますか?

答えて

1

は(あなたは、これはあなたが望むものであることを書きました)。 git merge-baseに電話し、変数BASEにローカル支店との等価性を確認して保存します。 BASE変数には何が含まれていると思いますか?これは、あなたが提供した2つのコミットの間に共通の祖先を含みます。過去にリモートから引っ張った後にローカルブランチが変更されない場合は、両方のコミット(変数LOCALBASE)が同じになります。 ローカルリポジトリが変更されていないかどうかを確認する可能性が高いまた、メッセージが非等価の場合に表示されるはずです。

ページgit merge-base exampleの最初の画像をご覧ください。あなたが地元の支店を過去に引っ張ったとしたら、リモートブランチとローカルブランチの両方がコミット1になります。その後、リモートにいくつかのコミットが追加されるため、この図ではAという名前のブランチになる可能性がありますが、ローカルブランチは変更されないため、コミットを指示します。1。この状態でgit merge-baseに電話すると、結果はコミット1となり、等価となります。

もう1つの問題があります。リモートをフェッチしますか? AFAIKコマンドは自動的にそれを行いません。

+0

あなたは 'git'を使い始めたばかりの人にギリシャ語を話しています。私は本当に自分の変更を引き出し、コミットし、プッシュする方法しか知りません。それだけです。 – Kevin

+1

@ケビンあなたが理解していないことや理解していることをより具体的にするなら、答えを出すことができます。あなたは単に 'pull'、' commit'、 'push'を知っていると言いますが、あなたの例でもっと高度なgitコマンドを使用していたので、あなたはそれをもっとよく理解していると思いました。たぶん、まずgitについてもっと学ばなければならないかもしれません:)このトピックではgitの動作を説明することはできません。 – MBI

+1

@Kevin実行すべき変更を要約するには、 'git fetch'を追加し、等価チェックを非等価チェックに変更し、' LOCAL'と 'REMOTE'を比較してください、' BASE'を使う理由はありません。 – MBI

0

シングル'='は属性です。

'=='を使用して比較してください。だから、

:あなたは、リモート、ローカルより新しいかどうかをチェックしません提供されたスクリプトで

if [ $LOCAL == $BASE ]; then 
+2

。 POSIXは、実際には比較のために単一のものを使用することを要求していますが、Bashは2 =を許しています。 – randomdude999

+0

@ randomdude999あなたが正しいです、私は最初に*/bin/sh *に気づきませんでした。 –

+0

'=' '=='でも違いはありません – Kevin

0

テストする必要があります:それはバッシュで動作する方法はありません

if [ "$LOCAL" == "$BASE" ]; then 
+0

は、最初の回答に記載されています。 '=' vs '=='は何の違いもありません – Kevin

+0

最初の答えは二重引用符 – yorammi

関連する問題