2015-03-13 14 views
6

Pracując na gałęzi funkcji, używam tego polecenia Git zaktualizować „rozwijać” oddział do najnowszego stanu bezpośrednio przed łączenia funkcji Moja oddział z „rozwijać”:Dlaczego "git fetch origin branch: branch" działa tylko w gałęziach długoterminowych?

git fetch origin develop:develop 

To działa, tj. lokalne punkty "rozwinięcia" przy tym samym zatwierdzeniu, co "pochodzenie/rozwój" i są w najnowszym stanie z pochodzeniem.

Jakoś jednak ta komenda nie powiedzie, gdy „rozwijać” oddział jest wyrejestrowany:

fatal: Refusing to fetch into current branch refs/heads/develop of non-bare repository 
fatal: The remote end hung up unexpectedly 

To pomogłoby mi zrozumieć Git lepiej, gdybym wiedział, dlaczego tak się dzieje.

Odpowiedz

7

Komunikat o błędzie pochodzi z builtin/fetch.c#check_not_current_branch().
To funkcja przechodzi przez całą drogę z powrotem do commit 8ee5d73, Oct. 2008, git 1.6.0.4

komentarz jest pouczająca:

Niektóre mylące tutoriale zasugerował, że byłby to dobry pomysł, aby sprowadzić do bieżącego oddziału z czymś takim:

git fetch origin master:master 

(lub nawet gorzej: ten sam wiersz poleceń z "pull" inste reklama "pobrania").
Chociaż przechowywanie tego, co ma być ciągiem, może być logiczne, zwykle jest to nieprawidłowe, gdy bieżącą gałęzią jest "master".
To powinno być dozwolone tylko wtedy, gdy (niepoprawne) "git pull origin master:master" próbuje obejść, podając --update-head-ok do leżących pod "git fetch", w przeciwnym razie powinniśmy odmówić, ale gdzieś wzdłuż linii straciliśmy to zachowanie.

Sprawdzanie bieżącego oddziału jest teraz wykonywane tylko w postaci wykonanej w niezarejestrowanych repozytoriach , co stanowi ulepszenie w stosunku do oryginalnego zachowania.

Biorąc pod uwagę, że funkcja check_not_current_branch() jest called with:

if (!update_head_ok) 
     check_not_current_branch(ref_map); 

Oznacza to git fetch -u origin develop:develop powinno działać.

-u 
--update-head-ok 

Domyślnie git sprowadzić odmawia zaktualizować głowę, która odpowiada aktualnej gałęzi. Ta flaga wyłącza czek.
To jest wyłącznie do użytku wewnętrznego do git pull do komunikowania się z git fetch i chyba, że ​​wdrażasz własną Porcelanę, której nie powinieneś używać.

Nawet jeśli nie mają używać tej opcji, to jest odpowiedź na swoje początkowe wymagania, dzięki czemu „git fetch origin branch:branch” pracę na bieżącym gałęzi.


Jeśli chodzi o pochodzenie tej poprawki, follow the discussion there.

Chociaż może to sensu przechowywać co chcesz ciągnąć

czyli fetch część: przechowuje historię zdalną z zaktualizowanym origin/master.
Ale jest to szczególnie uszkodzone, gdy bieżący oddział lokalny jest również master.
Jak wspomniano in this answer:

myślę "git fetch url side:master" kiedy master jest obecny oddział i pominęliśmy --update-head-ok jest zepsuty.
Test kończy się niepowodzeniem przy bieżącym numerze master.

Nie zaktualizuje również katalogu roboczego i pozostawi indeks tak, jakby usunąć wszystkie elementy.

+0

Czy możesz uczynić jaśniejszym _why_ git, który zapobiega domyślnie 'git fetch origin master: master'? Czuję, że kluczem do zrozumienia tego może być cytat, ale jego znaczenie jest dla mnie niejasne: _ "Chociaż może być sens przechowywanie tego, co chcesz przeciągnąć, zwykle jest ono niepoprawne, gdy bieżąca gałąź jest" master "." _ Co autor ma na myśli przez "przechowywanie tego, co chcesz ciągnąć"? – sleeparrow

+0

@sleeparrow Musiałem wrócić do oryginalnego wątku dla tej poprawki: https://www.spinics.net/lists/git/msg82242.html. Zaktualizowałem odpowiedź. – VonC

1

git fetch tylko pobiera dane ze zdalnego repo

  1. to nie aktualizuje swoje lokalne oddziały, nawet the're skonfigurować zdalne śledzenie tych
  2. (ze względu na 1) nie może pobierać zdalnego oddział na lokalny. To jest po prostu nie cogit fetch zrobić

Według man:

git sprowadzić [< opcje>] [< repozytorium> [< refspec> ...]]

You może działać tak jak git fetch origin develop i zaktualizuje tylko twój zdalny oddział refernece origin/develop

W celu aktualizacji z lokalnym oddziałem można to zrobić w jeden sposób następujący:

  1. jednoznacznie określić, co zdalny oddział powinny być wyciągane na co miejscowy oddział: git pull origin develop:develop
  2. jeśli develop oddział jest wyrejestrowany teraz i to jest skonfigurowana do śledzenia origin/develop może po prostu uruchomić git pull i będzie dowiedzieć się, co ciągnąć

aktualizacja

Więcej od człowieka:

Kiedy git pobieraniu prowadzony jest z wyraźnymi oddziałów i/lub tagi sprowadzić na wiersza poleceń, na przykład git fetch origin master, podany w wierszu poleceń określa, co ma zostać pobrane (np. master w w przykładzie, który jest skrótem dla master :, co z kolei oznacza "pobrać główną gałąź, ale robię nie jawnie powiedzieć, co gałąź śledzenia zdalnego, aby zaktualizować ją z linii poleceń "), i przykładowe polecenie pobierze tylko gałąź master. Wartości zdalnego pobierania pliku określają, które gałęzie zdalnego śledzenia są aktualizowane.Gdy jest używany w ten sposób, wartości zdalnego pobierania nie mają żadnego wpływu na podejmowanie decyzji (tzn. Wartości nie są używane jako refspecs, gdy wiersze poleceń list wyświetlają refspecs); są używane tylko do decydowania, gdzie przechowywane są deklaracje, które są przechowywane, działając jako mapowanie.

Możliwe jest aktualizowanie lokalnych oddziałów, ale nadal nie rozumiem, dlaczego nie można tego zrobić, gdy znajdujesz się w oddziale, który chcesz zaktualizować.

+1

"Nie można pobrać zdalnego oddziału do lokalnego" - ale tak jest! Zobacz moje zaktualizowane pytanie. Działa, pod warunkiem, że lokalny "rozwój" NIE jest wyrejestrowany. – MaDa

+0

@MaDa, tak, masz rację. Tęskniłem za tym ... teraz też jestem zdezorientowany :) –

Powiązane problemy