SORU
1 Temmuz 2010, PERŞEMBE


Git bir şube ana Dalı bul

Bir ile aşağıdaki yerel depo var diyelim bu gibi ağaç katliamı:

master --> a
            \
             \
      develop c --> d
               \
                \
         feature f --> g --> h

usta ** 10, ve benim özelliği a new feature being prepared for 'develop' this is the latest stable release code, geliştirmek benim.

Benim uzaktan repo kanca kullanarak yapmak mümkün olmak istiyorum ne feature iter f taahhüt develop BAŞ doğrudan decendant sürece reddetti. yani ağaç özelliği git rebase d oldu çünkü bu gibi görünüyor tamamlama.

master --> a
            \
             \
      develop c --> d
                     \
                      \
               feature f --> g --> h

Bu mümkün:

  • feature ana şube tanımlamak?
  • f bir decendant ana şube yürütme tanımlamak?

Oradan ana Şube BAŞKANI ne olduğunu kontrol edin, ve eğer f öncül, eğer özelliği rebased için ihtiyacı olup olmadığını belirlemek için ana Şube BAŞKANI eşleşip eşleşmediğini görmek istiyorum.

CEVAP
2 Temmuz 2010, Cuma


Uzak depo bir kopyası olduğunu varsayarakgeliştirmekşube (ilk açıklama açıklanır bir yerel depo, ama göründüğü gibi de var uzaktan) gerekir elde etmek için ne düşünmek istiyorum, ama bu yaklaşım biraz farklı gelen ne var öngörülüyordu.

Git tarihi iptalleri DAG dayanmaktadır. Şube (“) Genel sadece geçici başvuruları” belirli bir noktaya sürekli büyüyen taahhüt eder etiketler DAG. taahhüt Gibi dalları arasındaki ilişki zamanla değişebilir, ama tamamlar arasındaki ilişki değildir.

    ---o---1                foo
            \
             2---3---o      bar
                  \
                   4
                    \
                     5---6  baz

baz (eski sürüm) bar dayanır gibi görünüyor? Ama eğer bar kapatırsak ne?

    ---o---1                foo
            \
             2---3
                  \
                   4
                    \
                     5---6  baz

Şimdi baz foo dayanır gibi görünüyor. Ama baz soy değişmedi, sadece bir etiket (ve elde edilen sarkan tamamlama) kaldırıldı. Ve eğer 4 yeni bir etiket eklersek ne olur?

    ---o---1                foo
            \
             2---3
                  \
                   4        quux
                    \
                     5---6  baz

Şimdi baz quux dayanır gibi görünüyor. Yine de, soy değişiklik yapmadı, etiketler değişti sadece.

Ancak, “6 taahhüt 3? soyundan tamamlama” soran olsaydı (farz 3 6 tam SHA-1 tamamlama adları), o zaman cevap “evet”, ister bar quux etiketleri mevcut ya da değil.

Yani, “geçerli ipucu soyundan taahhüt itti . gibi sorular sorabilirsin ^em>geliştirmekşube?”, ama güvenilir bir şekilde talep edemez “itti taahhüt ana dal nedir?”.

Ne istediğinizi yakın görünüyor çoğunlukla güvenilir bir soru:

Tüm itti tamamlama (hariç geçerli ipucu . ataları için ^em>geliştirmekve onun ataları), o anki ipucu vargeliştirmekbir veli:

  • en azından böyle bir taahhüt var mı?
  • tüm bu işleyen tek ebeveynli tamamlar?

Uygulanan olabilir:

pushedrev=...
basename=develop
if ! baserev="$(git rev-parse --verify refs/heads/"$basename" 2>/dev/null)"; then
    echo "'$basename' is missing, call for help!"
    exit 1
fi
parents_of_children_of_base="$(
  git rev-list --pretty=tformat:%P "$pushedrev" --not "$baserev" |
  grep -F "$baserev"
)"
case ",$parents_of_children_of_base" in
    ,)     echo "must descend from tip of '$basename'"
           exit 1 ;;
    ,*\ *) echo "must not merge tip of '$basename' (rebase instead)"
           exit 1 ;;
    ,*)    exit 0 ;;
esac

Bu, belki de her şeyi yasak istediğin bazı kapsayacaktır.

Başvuru için, burada uzun bir örneği tarih:

    A                                   master
     \
      \                    o-----J
       \                  /       \
        \                | o---K---L
         \               |/
          C--------------D              develop
           \             |\
            F---G---H    | F'--G'--H'
                    |    |\
                    |    | o---o---o---N
                     \   \      \       \
                      \   \      o---o---P
                       \   \   
                        R---S

Yukarıdaki kod kullanılabilecek Reddet HS kabul ederkenH', J, K, ya N ama olur da kabul L P (dahil birleştirir, ama onlar değil birleştirme ucugeliştirmek).

Ayrıca L ve P, reddetme değiştirmek ve soru sorabilirsiniz

Tüm itti tamamlama (hariç geçerli ipucu . ataları için ^em>geliştirmekve onun ataları):

  • her iki ebeveyni ile işleyen var mı?
  • en az bir tür değilse taahhüt geçerli ipucu vargeliştirmek(tek) üst?
pushedrev=...
basename=develop
if ! baserev="$(git rev-parse --verify refs/heads/"$basename" 2>/dev/null)"; then
    echo "'$basename' is missing, call for help!"
    exit 1
fi
parents_of_commits_beyond_base="$(
  git rev-list --pretty=tformat:%P "$pushedrev" --not "$baserev" |
  grep -v '^commit '
)"
case "$parents_of_commits_beyond_base" in
    *\ *)          echo "must not push merge commits (rebase instead)"
                   exit 1 ;;
    *"$baserev"*)  exit 0 ;;
    *)             echo "must descend from tip of '$basename'"
                   exit 1 ;;
esac

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • efaustus9

    efaustus9

    16 HAZİRAN 2006
  • MW Technology

    MW Technolog

    28 EKİM 2009
  • Willie D.

    Willie D.

    16 Aralık 2006