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.