Powiedzmy, że mam katalog /X/Y
, który jest repozytorium git. Czy można w jakiś sposób wywołać komendę git pull
wewnętrzną /X
, ale celując w /X/Y
katalog?
EDYCJA: Myślę, że zastanawiałem się konkretnie: czy można to zrobić za pomocą polecenia git, ale bez konieczności zmiany katalogów?
UWAGA: Zaakceptowałem odpowiedź VonC, ponieważ jest ona znacznie bardziej elegancka niż poprzednie opcje. Dla osób korzystających z Git starszych niż 1.8.5, patrz odpowiedź bstpierre poniżej .
Odpowiedzi:
Począwszy od gita 1.8.5 (IV kwartał 2013 r.) , Będziesz mógł „używać polecenia Git, ale bez konieczności zmiany katalogów”.
Zobacz commit 44e1e4 autorstwa Nazri Ramliy :
Ponieważ Git 2.3.4 (marzec 2015), a także zobowiązać 6a536e2 przez Karthik Nayaka (
KarthikNayak
) ,git
będzie leczyć "git -C '<path>'
" jako nie-op, gdy<path>
jest pusta.4 lata później Git 2.23 (III kwartał 2019 r.) Dokumentuje, że „
git -C ""
” działa i nie zmienia kataloguOznacza to, że dokumentacja teraz (wreszcie) obejmuje:
git -C
Jako przykład możesz użyć Git 2.26 (Q1 2020).Patrz popełnienia b441717 , popełnienia 9291e63 , popełnienia 5236fce , popełnienia 10812c2 , popełnienia 62d58cd , popełnienia b87b02c , popełnienia 9b92070 , popełnienia 3595d10 , popełnienia f511bc0 , popełnienia f6041ab , popełnienia f46c243 , popełnienia 99c049b , popełnienia 3738439 , popełnienia 7717242 , popełnienia b8afb90 (20 grudnia 2019), autor: Denton Liu (
Denton-L
) .(Połączone przez Junio C Hamano -
gitster
- w commit 381e8e9 , 05 lutego 2020)źródło
apt-get install software-properties-common python-software-properties
dodaj repozytorium gitadd-apt-repository ppa:git-core/ppa
. Ostatnim krokiem jest aktualizacja git:apt-get update && apt-get upgrade
.Edytuj :
Wystąpił błąd
git pull
lub nie możesz zrobić tego, co próbujesz zrobić za pomocą tego polecenia. Możesz to jednak zrobić za pomocą funkcji pobierania i scalania:Oryginalna odpowiedź :
Zakładając, że używasz bash lub podobnego, możesz to zrobić
(cd /X/Y; git pull)
.Strona man git określa niektóre zmienne (patrz „Repozytorium git”), które wydają się, że powinny pomóc, ale nie mogę sprawić, by działały poprawnie (z moim repozytorium w / tmp / ggg2):
Uruchomienie poniższej komendy, gdy mój cwd to / tmp aktualizuje repozytorium, ale zaktualizowany plik pojawia się w / tmp zamiast drzewa roboczego / tmp / ggg2:
Zobacz także tę odpowiedź na podobne pytanie , które pokazuje flagi
--git-dir
i--work-tree
.źródło
.git
katalogu.git --git-dir=/tmp/ggg2/.git --work-tree=/tmp/ggg2 pull
, pojawia się komunikat o błędzie. Ale jeśli zrobię to,git --git-dir=/tmp/ggg2/.git --work-tree=. pull
gdy jestem w / tmp, wstawi zaktualizowane pliki do / tmp tak, jak powinno.--work-tree
teraz jak--work-tree=/tmp/ggg2/
i--work-tree=/tmp/ggg2/.
ponieważ może to być problem z tym, jak jego parsowania ścieżkę.Możesz zawinąć go w skrypt bash lub alias git:
źródło
pushd/popd
pary zamiastcd/cd-
(cd xyz && git pull)
Ten post jest trochę stary, więc mógł wystąpić błąd i został naprawiony, ale właśnie to zrobiłem:
I zadziałało. Zajęło mi chwilę, aby dowiedzieć się, że chciał plik dot i plik nadrzędny (w standardowej konfiguracji są one zawsze nadrzędne / podrzędne, ale nie we WSZYSTKICH konfiguracjach, więc należy je wyraźnie określić).
źródło
Ponieważ niektóre moje serwery mają starsze wersje Ubuntu LTS, nie mogę łatwo zaktualizować gita do najnowszej wersji (która obsługuje opcję -C, jak opisano w niektórych odpowiedziach).
Ta sztuczka działa dla mnie dobrze, szczególnie dlatego, że nie ma skutków ubocznych niektórych innych odpowiedzi, które pozostawiają cię w innym katalogu niż miejsce, w którym zacząłeś.
Lub robiąc to jako jedno-liniowy:
Zarówno Linux, jak i Windows mają polecenia pushd i popd.
źródło
Stosując kombinację
pushd
,git pull
ipopd
możemy osiągnąć tę funkcjonalność:Na przykład:
źródło
Możesz napisać taki skrypt:
Możesz nazwać to jakoś
gitpull
.Jeśli wolisz, aby robił to dowolnymi katalogami zamiast
/X/Y
:Następnie możesz to nazwać za pomocą
gitpull /X/Z
Wreszcie, możesz spróbować znaleźć repozytoria. Mam
~/git
folder, który zawiera repozytoria, i możesz użyć tego, aby pociągnąć je wszystkie.źródło
(cd /X/Y && git pull)
.Dla każdego takiego jak ja, który próbował to zrobić za pomocą komendy drush (powłoka Drupal) na zdalnym serwerze, nie będziesz mógł skorzystać z rozwiązania, które wymaga dysku CD do katalogu roboczego:
Zamiast tego musisz użyć rozwiązania, które rozbija pull na pobieranie i scalanie:
źródło
Może to być podobny problem, ale możesz też po prostu połączyć łańcuch poleceń. na przykład
W jednej linii
Lub przez SSH.
źródło