Jak zaktualizować własne repozytorium?


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!


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


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.


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.


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://git@source.address: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://git@source.address:2000/repo
git  fetch ssh://git@source.address:2000/repo
git push --mirror remote_site

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.


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 )

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.