Jak zaktualizować własne repozytorium?

134

Utworzyłem czyste repozytorium, aby opublikować moje repozytorium, ale nie mogę dowiedzieć się, jak zaktualizować gołe repozytorium o bieżący stan głównego repozytorium.

Šimon Tóth
źródło
2
Zobacz tę odpowiedź: stackoverflow.com/questions/315911/…
Ken Bloom

Odpowiedzi:

84

Jeśli chcesz zduplikować wszystkie obiekty z głównego repozytorium, zrób to wewnątrz głównego repozytorium:

git push --all <url-of-bare-repo>

Alternatywnie, wykonaj pobieranie wewnątrz samego repozytorium:

git fetch <url-of-main-repo>

Nie możesz zrobić pull, ponieważ pull chce się połączyć, z HEADczym nie ma gołe repozytorium.

Możesz dodać je jako piloty, aby zaoszczędzić sobie pisania w przyszłości:

git remote add <whatever-name> <url-of-other-repo>

Wtedy możesz po prostu to zrobić

git push --all <whatever-name>

lub

git fetch <whatever-name>

w zależności od tego, w jakim repozytorium się znajdujesz. Jeśli <whatever-name>tak origin, możesz to nawet całkowicie pominąć.

Zastrzeżenie: nie jestem guru gita. Gdybym powiedział coś złego, chciałbym zostać oświecony!

Aktualizacja: przeczytaj komentarze!

Tomasz
źródło
8
Kiedy zrobiłem git-fetch --allwewnątrz czystego repozytorium, nie widziałem aktualizacji, które wprowadziłem do głównego repozytorium, ale kiedy wypycham je z głównego repozytorium git push --all <url-of-bare-repo>, widzę aktualizacje git log. Przypuszczalnie jest na to proste wytłumaczenie - czy ktoś może to wyjaśnić?
pho79
2
@Thomas - Tak, przez „nie widziałem”, mam na myśli, git logże nie pokazuje tych aktualizacji w samym repozytorium. (Ani też git log --all, ani działające repozytorium utworzone przez sklonowanie samego repozytorium - albo przez, git log --allalbo po prostu patrząc na nowe pliki, które powinny się tam pojawić). To dość szybki test, aby przekonać się sam. Przeważnie jestem po prostu ciekawy, czego mi brakuje.
pho79
73
Jeśli Twoje najdalsze repozytorium to coś w rodzaju github, gdzie nie masz dostępu, nie możesz uruchomić push itp., Możesz to zrobić git fetch -q origin master:masterw swoim lokalnym gołym repozytorium. Spowoduje to pobranie nowych rzeczy z głównej gałęzi githuba i zaktualizowanie do niej lokalnej gałęzi głównej.
Altreus,
4
@Altreus Rzeczywiście master:masterjest to, co jest wymagane, aby przejść HEAD do przodu do zdalnego repozytorium. W moim przypadku z powodu problemu nie mogłem już połączyć się z naszym gołym repozytorium, ponieważ brakowało gita. Dopóki to nie zostanie rozwiązane, wykonuję tunel zwrotny i pobieram do centralnego repozytorium za pomocą: git fetch ssh://localhost:8765/... master:masteri działa to jak urok. Dzięki!
estani
4
@Altreus Jeśli chcesz mieć wszystkie gałęzie, możesz to zrobićgit fetch origin *:*
JBert
71

Utworzyłem repozytorium za pomocą następującego polecenia

git clone --bare <remote_repo>

Następnie próbowałem zaktualizować nagiego klona, ​​używając odpowiedzi Thomasa, ale to nie zadziałało. Aby zaktualizować gołe repozytorium (o co chyba pytał Let_Me_Be), musiałem utworzyć repozytorium lustrzane:

git clone --mirror <remote_repo>

Następnie mogłem uruchomić następującą komendę w repozytorium lustrzanym, aby pobrać aktualizacje głównego repozytorium:

git fetch --all

Natknąłem się na to rozwiązanie, czytając Mirror a Git Repository By Pulling

austen
źródło
22
Aby zmienić istniejące repozytorium na kopię lustrzaną, wystarczy dodać 2 wiersze do pliku konfiguracyjnego git w <REPO> .git / config. W [remote "origin"]sekcji dodaj fetch = +refs/*:refs/*imirror = true
Isaac Betesh,
@IsaacBetesh Uratowałeś mój dzień :)
smc
55

Jedyne rozwiązanie poza odtworzeniem z pomocą git clone --mirrorpochodzi od Gregora :

git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

wtedy możesz git fetchi zobaczysz aktualizacje. Dziwne jest to, że przedtem, mimo że jest remoteskonfigurowany, nie ma żadnych gałęzi wymienionych w git branch -a.

Colin D. Bennett
źródło
1
To naprawdę mi pomogło! Projekt / repozytorium Capistrano również korzysta z tego ustawienia, aby umożliwić jednostronne git remote updatewykonanie zadania.
Minqi Pan
1
Jeśli pilot ma zaktualizowane lub usunięte gałęzie (i chcesz odzwierciedlić te zmiany), może być konieczne dodanie --forcei --pruneodpowiednio do git fetchlinii.
Elliott Slaughter
46

Zarozumiały:

$ git clone --bare https://github.com/.../foo.git

Pobierz za pomocą:

$ git --git-dir=foo.git fetch origin +refs/heads/*:refs/heads/* --prune

Uwaga: --git-dir=foo.gitnie jest wymagane, jeśli najpierw przejdziesz cddo katalogu.

antak
źródło
2
Chociaż nie jestem świadomy, kiedy to nastąpi, jeśli originnie jest zdefiniowane, zawsze możesz zastąpić originczęść ścieżką / adresem URL do oryginalnego repozytorium. na przykład$ git --git-dir=foo.git fetch https://github.com/.../foo.git +refs/heads/*:refs/heads/*
antak
To jest dokładnie to, czego szukałem. To działało doskonale.
Maxime Rouiller
13

Po wielu zabawach stwierdziłem, że to działa dla mnie.

Pewnego razu:

git clone --mirror ssh://[email protected]:2000/repo
git remote add remote_site ssh://git@remote_site.address/repo
git config remote.origin.fetch 'refs/heads/*:refs/heads/*'

Za każdym razem, gdy chcę zsynchronizować:

cd /home/myhome/repo.git
git --bare fetch ssh://[email protected]:2000/repo
git  fetch ssh://[email protected]:2000/repo
git push --mirror remote_site
simonvc
źródło
7
Trzecia linia ( git config remote.origin.fetch 'refs/heads/*:refs/heads/*') to klucz. Dobra odpowiedź, dzięki!
peterh - Przywróć Monikę
2
Jak powiedział @peterh, linia git config remote.origin.fetch 'refs/heads/*:refs/heads/*'jest odpowiedzią. Po naciśnięciu tego polecenia mogę po prostu git fetchi repozytorium zsynchronizuje się ze zdalnym.
joker
3

Dodaj czyste repozytorium jako repozytorium zdalne, a następnie użyj git push.

Philipp
źródło
Więc jeśli chcę to zrobić bez wypychania, nie mogę użyć czystego repozytorium i użyć dowiązania symbolicznego lub czegoś w tym rodzaju?
Šimon Tóth
Wypychanie to normalna metoda przenoszenia zawartości repozytorium do czystego repozytorium, nie ma potrzeby jej unikać.
Filip
2
Nie możesz zawsze naciskać. Na przykład, jeśli bare jest w sieci prywatnej, a główne repozytoria jest publiczne (na przykład na
GitHubie
0

U mnie ta kombinacja zadziałała:

git remote add remote_site https://github.com/project/repo.git
git fetch -u remote_site +refs/heads/*:refs/heads/*
git fetch -u remote_site +refs/tags/*:refs/tags/*
git push --mirror

Parametr -u do pobierania był konieczny, w przeciwnym razie otrzymuję komunikat o błędzie: „Odmowa pobrania do aktualnej gałęzi refs / heads / master of non-bare repository” (zobacz też https://stackoverflow.com/a/19205680/4807875 )

Alexander Samoylov
źródło