2010-02-20 19 views
8

Chcę śledzić zdalną gałąź master z nowego zdalnego repozytorium. Obie już istnieją.Git setup remote tracking branch

Jak to zrobić w git? Nie mogę tego naprawić. Próbowałem:

git remote add otherRepo git://... 
git branch -t myTrack otherRepo/master 

Jednak pojawia się następujący błąd:

fatal: Not a valid object name: 'otherRepo/master'.

+3

Czy wykonałeś polecenie 'git fetch otherRepo' przed próbą rozgałęzienia? 'git remote add' po prostu konfiguruje pilota, nie pobiera automatycznie. Jeśli już ją pobrałeś, czy jesteś pewien, że ma ona gałąź o nazwie master? 'git branch -r' lub' git remote show -n innyRepo' (* po pobraniu *), aby sprawdzić, które gałęzie ma. –

+0

@crhis: dziękuję, teraz to działa. Wydaje się logiczne, że muszę pobrać, ale to dodaje, wszystkie inne gałęzie z innychRepo też. Czy mogę po prostu pobrać inne wzorce/wzorce? Nie chcę zaśmiecać gałęzi -r. –

Odpowiedz

12

Zgodnie z komentarzem: git remote add otherRepo … konfiguruje tylko pilota, nie pobiera z niego niczego. Będziesz musiał uruchomić git fetch otherRepo, aby pobrać gałęzie zdalnego repozytorium, zanim będziesz mógł tworzyć lokalne gałęzie na ich podstawie.


(odpowiadając na dalszych komentarzy przez OP)

Jeśli tylko chcesz śledzić jeden oddział ze zdalnego repozytorium, można ponownie skonfigurować pilota pobierał nieruchomości (remote.otherRepo.fetch).

# done as a shell function to avoid repeating the repository and branch names 
configure-single-branch-fetch() { 
    git config remote."$1".fetch +refs/heads/"$2":refs/remotes/"${1}/${2}" 
} 
configure-single-branch-fetch "$remoteName" "$branch" 
# i.e. # configure-single-branch-fetch otherRepo master 

Po tym, git fetch otherRepo pobierze tylko zdalnego repozytorium za master oddziału do oddziału zdalnego śledzenia „” otherRepo/master w lokalnym repozytorium.

Do czyszczenia pozostałe „zdalnych oddziałów śledzenia”, można je wszystkie usunąć i ponownie pobrać tylko jeden chcesz, czy można selektywnie usunąć wszystkie z nich z wyjątkiem tylko jednej chcesz:

git for-each-ref --shell --format='git branch -dr %(refname:short)' refs/remotes/otherRepo | sh -nv 
# remove the -nv if the commands look OK, then 
git fetch otherRepo 

# OR 

git for-each-ref --shell --format='test %(refname:short) != otherRepo/master && git branch -dr %(refname:short)' refs/remotes/otherRepo | sh -nv 
# remove the -nv if the commands look OK 

Jeśli zdecydujesz, że chcesz śledzić więcej niż jedną zdalną gałąź, ale nie wszystkie, możesz mieć wiele konfiguracji pobierania (z git config --add remote."$remoteName".fetch … lub używając git config --edit, aby bezpośrednio powielić i edytować wiersz w pliku konfiguracyjnym twojego repozytorium).

Jeśli chcesz również uniknąć pobierania znaczników z pilota, skonfiguruj właściwość tagopt na pilocie (remote.otherRepo.tagopt).

git config remote."$remoteName".tagopt --no-tags 
# i.e. # git config remote.otherRepo.tagopt --no-tags 
+0

dzięki za bardzo kompletną odpowiedź. Wydaje się, że tak łatwa operacja jest tak skomplikowana. Cokolwiek –

4

można spróbować

git checkout -b myTrack otherRepo/master 

Spowoduje to utworzenie nowego myTrack oddział, który śledzi/gałąź master otherRepo.

+0

Nie działa, podany błąd: fatal: git checkout: aktualizowanie ścieżek jest niezgodne z przełączaniem gałęzi. Czy masz zamiar zrealizować polecenie "otherRepo/master", którego nie można rozwiązać jako commit? ' –

+0

Pozwolił mi pracować po wykonaniu zdalnego dodawania i pobierania. – Von