SORU
15 Temmuz 2010, PERŞEMBE


git: gerekli çekersen Çek

Uzaktan repo değişip değişmediğini kontrol etmek için nasıl kaldırmalıyım?

Şimdi bu basit bir komut dosyası kullanıyorum:

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

ama oldukça ağır.

Daha iyi bir yol biliyor musunuz? İdeal çözüm, tüm uzak dalları kontrol eder, ve değişti dalları dönüş isimler ve yeni sayısını her birinde tamamlar.

CEVAP
19 Temmuz 2010, PAZARTESİ


İlk git remote update tarih kadar uzak başvuruları getirmek için kullanın. Sonra birkaç şey yapacağız, gibi:

  1. git status -uno izlediğiniz şube önde, arkasında olup olmadığını size söyleyecektir veya gelişti. Eğer bir şey diyorsa, yerel ve uzak aynıdır.

  2. git show-branch *master taahhüt Efendi (örneğin ana ve origin/master) biten tüm dalları gösterecektir.

Eğer git remote update (git remote -v update) -v kullanırsanız çok daha ileri komutlarına ihtiyacın yok bu yüzden güncelleme, var olan görebilirsiniz.

Ancak, komut dosyası veya bir program, bunu yapmak ve doğru/yanlış değeri ile bitirmek istiyor gibi görünüyor. Yani, eğer var yolları kontrol arasındaki ilişki mevcut KAFA taahhüt ve başın şube seni takip ediyor, ancak bu yana orada dört olası sonucu edemezsin azaltmak için bir Evet/Hayır cevabı. Ancak, eğer bunun için bir pull --rebase sonra tedavi "yerel arkasında" ve "yerel olan birbirinden kopuk" gibi, "ihtiyaç " çekme" ve diğer ikisi gibi "gerek yok çekin".

Herhangi ref usta ve origin/master için bunu yapmak ve bunları karşılaştırmak, böylece git rev-parse <ref> kullanarak kimlik tamamlama alabilirsiniz. Eğer eşit iseler, dalları aynıdır. Eğer eşit olurlarsa, diğer önde olduğunu bilmek istiyoruz. git merge-base master origin/master kullanarak her iki şubenin ortak atası söyleyecektir, ve eğer ayrışmış değil mi eğer bu ya da diğeri ile aynı olacaktır. Eğer üç farklı kimlik alırsanız, dallar ayrılmaktadır.

Bu doğru yapmak için, bir komut örneğin, mevcut şube başvurmak gerekir, ve uzak şube izliyordur. /etc/bash_completion.d istemi-ayar bash fonksiyonu şube adlarını almak için bazı yararlı kod vardır. Ancak, muhtemelen aslında isim değil. Git dal ve taahhüt atıfta için harika GZ git rev-parse --help (belirtildiği gibi) sahiptir. Özellikle, mevcut şube (a-kafası kopmuş durumda değiliz varsayarak) ve ters yönde Şubesi için @{u} (origin/master gibi) @ kullanabilirsiniz. git merge-base @ @{u} mevcut şube ve yukarı sapmak ve git rev-parse @ git rev-parse @{u} iki ipuçları karma verecek olan commit () karma dönecektir. Bu aşağıdaki komut şeklinde özetleyebiliriz

#!/bin/sh

LOCAL=$(git rev-parse @)
REMOTE=$(git rev-parse @{u})
BASE=$(git merge-base @ @{u})

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

Not:git eski sürümleri @{0} yerine kullanmak zorunda kalabilirsiniz böylece @ kendi başına, izin vermedi.

Senaryoyu da git fetch git remote update öncelikle güncel takip dalları getirmek için bir şey yaptın varsayar. Ben yapmadım bu senaryoyu çünkü daha esnek yapabilir, çekici ve karşılaştırma olarak ayrı operasyonda, örneğin istiyorsanız karşılaştırın olmadan alma çünkü zaten getirilen son zamanlarda.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eric Magidson

    Eric Magidso

    4 Ocak 2009
  • Liam Underwood

    Liam Underwo

    19 Mayıs 2009
  • Liberator

    Liberator

    14 EYLÜL 2007