2016-11-24 47 views
7

Mam następujące gałęzie w odległym źródle.git pobiera gałęzie o określonym przedrostku

ft_d_feature_abc 
ft_d_feature_xyz 
ft_d_feature_lam 
ft_d_feature_ton 
ft_m_feature_mak 
ft_m_feature_echo 
ft_m_feature_laa 
ft_m_feature_pol 

Chcę pobrać gałęzie, które zaczynają się od ft_d. Jak mogę to osiągnąć dzięki git fetch? Moja wersja Git to 1.7.9.5.

Odpowiedz

5

Ponieważ Git wersja 2.6, można określić częściowe podciągi (z proste dopasowanie w stylu globalnym) w refspec do pobrania lub wypychania. Dlatego:

git fetch origin 'refs/heads/ft_d*:refs/remotes/origin/ft_d*' 

zrobi to, o co prosisz. Uogólnione wyrażenia regularne to: , nie dostępne, ani uogólnione globsy: dozwolony jest tylko jeden określony przypadek * dopasowywania wszystkiego między dwoma ustalonymi ciągami. (Niektóre stałe ciągi tutaj może być pusta. Zazwyczaj tylna połowa, czyli zwykle pobrać refs/heads/* nie refs/heads/*x dostać tylko oddziały, których nazwa kończy się x.)

Jeśli Git jest starsza niż 2.6, nie ma to prosty sposób zrobienia tego w jednym pobraniu. Będziesz potrzebował wielu pobrań, w pętli, i będziesz musiał zrobić własne dopasowanie nazw, być może używając wyjścia z git ls-remote.

(Oczywiście, git fetch origin zwykle tylko przynieść wszystko nad, jak podano we wpisie remote.origin.fetch konfiguracyjnym lub wpisów, w większości przypadków nie ma sensu ograniczać git fetch ten sposób. Czy na pewno chcesz się męczyć?)

+0

Moja wersja Git to 1.7.9.5. Mam zamiar zaktualizować mój git i sprawdzę to. – dnsh

+0

To działa. Ponieważ jestem nowy w git, nie byłem w stanie tego zrozumieć. Musiałem przeczytać https://git-scm.com/book/en/v2/Git-Internals-The-Refspec, aby zrozumieć to rozwiązanie. – dnsh

0

nie jestem pewien Git obsługuje regexes do pobierania oddział, jednak można stworzyć prosty skrypt, który zrobi to za ciebie:

for i in {1..3}; 
do 
    git fetch origin ft_d_feature$i 
done 
+0

dla uproszczenia pisałem feature1,2,3. W nazwach moich gałęzi nie ma sekwencji. Zaktualizowałem moje pytanie. – dnsh

0

Innym sposobem jest lista zdalni branże:

PREFIX='ft_d_feature_' 

for BRANCH in $(git branch | cut -c 3-); do 
    if [[ $BRANCH = $PREFIX* ]] ; then 
     echo $BRANCH; 
    fi 
done 

Edit

Aby właściwie nazwać git fetch dla każdego oddziału:

PREFIX='ft_d_feature_' 

for BRANCH in $(git branch | cut -c 3-); do 
    if [[ $BRANCH = $PREFIX* ]] ; then 
     git fetch origin $BRANCH 
    fi 
done 

Edit2

Innym sposobem jest stworzenie aliasu git, można go dodać w pliku ~/.gitconfig.

[alias] 
    fetch-prefix = "!f(){ for BRANCH in $(git branch | cut -c 3-); do case $BRANCH in $1*) git fetch origin $BRANCH; esac; done; }; f" 

Zastosowanie: git fetch-prefix ft_d_feature_