2010-02-10 16 views
45

założyłem zdalnego repozytorium i mogę wcisnąć nowe zmiany do niego, ale nie może pobierać od niego, zawsze pojawia się (raczej tajemniczy) Komunikat o błędzie:git odmawiającej sprowadzić do bieżącej gałęzi

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

Co to znaczy? Co powinienem zrobić, aby włączyć pobieranie?

(Należy pamiętać, że to zdalne repozytorium służy tylko jako repozytorium zapasowe, więc powinno to być dokładną kopią mojego lokalnego repozytorium.) Naprawdę nie mogę zrozumieć, dlaczego mogę go przesłać, ale nie mogę go pobrać. ..)

Mój config wygląda następująco:

[remote "origin"] 
    url = ssh://blablablah 
    fetch = +refs/*:refs/* 
    mirror = true 
+0

Czy możesz pokazać swoją konfigurację dla repozytorium, do którego przechwytujesz? –

+0

Mmh, jak mogę zobaczyć tę konfigurację? Właśnie skonfigurowałem to zdalne repozytorium za pomocą 'git remote add name server', być może z opcją' --mirror'. –

+0

Oliver, konfiguracja jest w '.git/config'. W szczególności, Charles mówi o sekcji "[zdalny ...]", jak sądzę. –

Odpowiedz

24

Co starasz się zrobić, to pobrać oddział jesteś workin na. Oznacza to, że masz na gałęzi głównej i próbujesz go zaktualizować. To nie jest możliwe. Częściej aktualizuje gałęzie remotes/*, a następnie przenosi je do lokalnych. Co chcesz, to, być może,

git remote add otherrepo thehost:/the/path.git 

Będzie repozytorium konfiguracji zostać pobrane do remotes/otherrepo/*. git fetch otherrepo powinien załatwić sprawę. Alternativeley, możesz ręcznie edytować swój .git/config i ustawić fetch dla pilota na coś takiego jak refs/heads/*:refs/remotes/otherrepo/*.

+0

Dzięki! Naprawdę nie rozumiem, co robię, ale podążając za twoją radą, teraz działa dobrze. Domyślam się, że trzeba jednoznacznie określić, gdzie odległe gałęzie znajdą się w lokalnym repozytorium; Prawdopodobnie zdarzyło się, że oddział zdalny pokrywa się z moim lokalnym oddziałem, chociaż nie jestem pewien, czy to ma sens. :-) Dzięki! –

+1

Mniej lub więcej. Fakt, że zdalne refs są w "refs/remote" to tylko konwencja, ale tak naprawdę nie chcesz, aby pobrać bezpośrednio do "refs/hreads/master". Zwłaszcza, gdy twoje "refs/heads/master" jest wyrejestrowane. –

+0

@ MichaelKrelin-hacker co mam napisać zamiast "thehost" –

1

Miałem ten problem, gdy bezmyślnie sklonowałem repozytorium, zamiast go pobrać, więc oba repozytoria były mistrzami. Jeśli nie wykonałeś żadnej pracy w zdalnym repozytorium, możesz naprawić rzeczy za pomocą podstawowych poleceń git w następujący sposób: (1) usunąć zdalne repozytorium, (2) skopiować lokalne repozytorium do miejsca, w którym znajdował się zdalny, (3) usunąć lokalna, a następnie (4) skonfigurować lokalne repozytorium używając

git init; git fetch $REMOTE_GIT_REPOSITORY_URL 

Then git pull i git push zrobi właściwe rzeczy. Zaletą unikania git remote, według bardziej wydajnej i pryncypialnej odpowiedzi Michaela, jest to, że nie musisz myśleć o semantykach gałęzi śledzenia.

+0

Klon jest klonem."Master repo" jest czystą konwencją. Pytanie tutaj dotyczy zachowania "git fetch remote ref: ref", gdy HEAD jest ustawione na ref. – qneill

35

Jeśli ktokolwiek znajdzie to, ponieważ chce pobrać do bieżącej gałęzi, możesz użyć flagi --update-head-ok. Od the docs:

-u
--update-head-ok
Domyślnie git sprowadzić odmawia zaktualizować głowę, która odpowiada aktualnej gałęzi. Ta flaga wyłącza czek. Jest to wyłącznie do użytku wewnętrznego do ciągnięcia git, aby komunikować się z git fetch i , chyba że używasz własnej porcelany, której nie powinieneś używać.

W niektórych przypadkach chcemy wdrożyć nasze własne polecenia porcelanowe, np. Automatyzacja i oprzyrządowanie.

+1

Dlaczego git nie chce aktualizować głowy w tym przypadku? Dlaczego nie chcą, abyś używał tej flagi? –

+0

Ciekawi mnie również, dlaczego w przypadku pobierania zaktualizować wszystkie inne gałęzie z wyjątkiem bieżącego? – cdosborn

+0

Sądziłem, że ograniczenie to uniemożliwiło Ci utratę pracy, ale zweryfikowaliśmy, że nawet przy użyciu flagi "-u" nie-szybkie zatwierdzenia są odrzucane: '! [odrzucone] master -> master (non-fast-forward) ' –

-1

Mam ten sam problem. Najpierw próbuję pobrać, używając tego

Miałem ten sam problem, o którym wspomniałeś. Potem spróbowałem tego prostego polecenia.

git pull [remote_name] [branch_name] 

Uwaga spowoduje pobranie i scalenie zmian. Jeśli używasz terminala to plik jest otwarty, wymagający zatwierdzenia wiadomości. Za pomocą tego komunikatu popchniesz ostatnie zatwierdzenie. Wypróbuj to polecenie, a na końcu będziesz mógł przesłać żądanie.

git push [remote_name] [branch_name_local] 
0

Także to powinno działać, jeśli jesteś w głównego gałęzi i chce uzyskać najnowszy spróbować tej

git pochodzenie ciągnąć mistrza

0

Czy rzeczywiście wpisując Git komendy do wiersza poleceń, czy uruchamiasz plik wykonywalny Git z własnego kodu?
Jeśli używasz go z kodu, czy jesteś pewien, że Git próbuje pobrać właściwy katalog lokalny?

Istnieją dwa sposoby, aby to zrobić:

  1. Stosować opcje przewidziane przez język programowania, aby ustawić właściwy katalog roboczy przed wykonaniem Git
    (C# example, bo to, co mam przy użyciu)

  2. Zawsze przekazywać the -C parameter do Git, aby określić katalog z lokalnym repozytorium.


Mam projektu gdzie Dzwonię GIT wykonywalny z kodu C# i mam ten sam komunikat o błędzie jak w pytaniu, kiedy przypadkowo zapomniał ustawić -C parameter.

Powiązane problemy