Mercurial ma sposób drukowania katalogu głównego (zawierającego .hg) poprzez
hg root
Czy jest coś równoważnego w git, aby uzyskać katalog zawierający katalog .git?
git
version-control
wojo
źródło
źródło
bzr root
często korzystano z Bazarugit rev-parse --git-dir
, jak wyjaśniono w tym komentarzuOdpowiedzi:
Tak:
Jeśli chcesz replikować polecenie Git bardziej bezpośrednio, możesz utworzyć alias :
i teraz
git root
będzie działać tak samohg root
.Uwaga : W submodule wyświetli się katalog główny submodułu, a nie repozytorium nadrzędne. Jeśli używasz Git> = 2.13 lub nowszej, istnieje sposób, że podmoduły mogą wyświetlać katalog główny superprojektu. Jeśli twój git jest starszy, zobacz inną odpowiedź.
źródło
git config --global alias.exec '!exec '
więc mogę robić takie rzeczygit exec make
. Działa to, ponieważ aliasy powłoki są zawsze wykonywane w katalogu najwyższego poziomu.hg root
robi. Drukuje katalog najwyższego poziomu z pobranego repozytorium. Nie przełącza cię na to (i nie mógł tego zrobić ze względu na interakcję całej koncepcji bieżącego katalogu i powłoki).~/my.proj/foo/bar
i~/my.proj
jest do niej dowiązanie~/src/my.proj
, powyższe polecenie przeniesie Cię do~/src/my.proj
. Może to stanowić problem, jeśli cokolwiek zechcesz zrobić później, nie jest agnostyczne dla drzewa..git
.man
Aktualizacjagit-config
(pod Alias ) mówi:W systemie UNIX możesz wykonać:
źródło
.zshrc
i zdefiniuję `alias cg =" cd $ (git root) ", część $ () zostanie oceniona w czasie źródłowym i zawsze wskazuje na ~ / dotfiles, ponieważ tam jest mój zshrc .Został
--show-toplevel
dopiero niedawno został dodany dogit rev-parse
lub dlaczego nikt go wymienić?Ze strony podręcznika
git rev-parse
:źródło
git-rev-parse
- bo jego nazwa sugeruje, że chodzi o przetwarzanie specyfikacji wersji. BTW, z przyjemnością zobaczęgit --work-tree
pracę podobną dogit --exec-path[=<path>]
: „Jeśli nie podano ścieżki, git wydrukuje bieżące ustawienie”; przynajmniej IMO byłoby logicznym miejscem, aby poszukać takiej funkcji.root = rev-parse --show-toplevel
używać aliasu w swoim gitconfig.git config --global alias.root "rev-parse --show-toplevel"
a wtedygit root
będziesz w stanie wykonać pracęgit rev-parse --show-toplevel
działa, gdy próbowałem go w submodule. Wyświetla katalog główny submodułu git. Co to dla ciebie drukuje?--show-cdup
do--show-top-level
w lutym 2011 r. (Po przesłaniu tej odpowiedzi).Co powiesz na „
git rev-parse --git-dir
”?The
--git-dir
opcja wydaje się działać.Na stronie podręcznika git rev-parse :
Możesz zobaczyć to w akcji w tym
git setup-sh
skrypcie .Jeśli jesteś w folderze submodułowym, z Git> = 2.13 , użyj :
Jeśli używasz
git rev-parse --show-toplevel
, upewnij się, że używasz Git 2.25+ (Q1 2020) .źródło
.git
jeśli jesteś już w katalogu głównym. (Przynajmniej działa na msysgit.)Aby napisać prostą odpowiedź tutaj, abyśmy mogli skorzystać
aby wykonać zadanie, po prostu skonfiguruj swojego gita za pomocą
a następnie możesz dodać następujące elementy do
~/.bashrc
:dzięki czemu możesz po prostu
cdroot
przejść na sam szczyt repozytorium.źródło
Jeśli jesteś już na najwyższym poziomie lub nie jesteś w repozytorium git
cd $(git rev-parse --show-cdup)
, zabierze Cię do domu (tylko cd).cd ./$(git rev-parse --show-cdup)
jest jednym ze sposobów naprawienia tego.źródło
cd "$(git rev-parse --show-cdup)"
. To działa, ponieważcd ""
zabiera cię nigdzie, a nie z powrotem$HOME
. A i tak najlepszą praktyką jest cytowanie wywołań $ (), na wypadek, gdyby wypisały coś ze spacjami (ale nie w tym przypadku to polecenie).$PWD
. Ten przykład będzie git rozwiązać w stosunku do głównego$PWD
zamiastrealpath $PWD
.Aby obliczyć bezwzględną ścieżkę bieżącego katalogu głównego git, powiedzmy do użycia w skrypcie powłoki, użyj tej kombinacji readlink i git rev-pars:
git-rev-parse --show-cdup
daje odpowiednią liczbę „..”, aby dostać się do katalogu głównego z cwd lub pusty ciąg znaków, jeśli jesteś w katalogu głównym. Następnie dodaj „./”, aby zająć się pustą wielkością ciągu, i użyjreadlink -f
do przetłumaczenia na pełną ścieżkę.Możesz również utworzyć
git-root
polecenie w PATH jako skrypt powłoki, aby zastosować tę technikę:(Powyższe można wkleić do terminala, aby utworzyć git-root i ustawić bity wykonania; rzeczywisty skrypt znajduje się w wierszach 2, 3 i 4).
I wtedy będziesz w stanie biec
git root
aby uzyskać katalog główny bieżącego drzewa. Zauważ, że w skrypcie powłoki użyj „-e”, aby spowodować zamknięcie powłoki, jeśli rev-pars nie powiedzie się, abyś mógł poprawnie uzyskać status wyjścia i komunikat o błędzie, jeśli nie jesteś w katalogu git.źródło
"$(git rev-parse ...)"
zamiast hacków takich jak./$(git rev-parse ...)
.readlink -f
nie działa tak samo na BSD. Zobacz to SO dla obejść. Python odpowiedź prawdopodobnie będzie działać bez instalowania czegokolwiek:python -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' "$(git rev-parse --show-cdup)"
.Jak zauważyli inni, sednem rozwiązania jest użycie
git rev-parse --show-cdup
. Istnieje jednak kilka skrajnych przypadków do rozwiązania:Gdy cwd jest już korzeniem działającego drzewa, polecenie zwraca pusty ciąg.
W rzeczywistości tworzy pustą linię, ale podstawienie polecenia usuwa przerwanie linii końcowej. Ostatecznym wynikiem jest pusty ciąg.
Większość odpowiedzi sugeruje wcześniejsze przygotowanie wyjścia
./
tak, aby puste wyjście stało się"./"
nimcd
.Gdy GIT_WORK_TREE jest ustawiony na lokalizację, która nie jest rodzicem cwd, wyjściem może być bezwzględna nazwa ścieżki.
Poprzedzenie
./
jest źle w tej sytuacji. Jeśli a./
jest poprzedzone ścieżką bezwzględną, staje się ścieżką względną (i odnoszą się tylko do tej samej lokalizacji, jeśli cwd jest katalogiem głównym systemu).Dane wyjściowe mogą zawierać białe znaki.
To naprawdę ma zastosowanie tylko w drugim przypadku, ale ma łatwą poprawkę: użyj podwójnych cudzysłowów wokół podstawiania poleceń (i wszelkich późniejszych zastosowań wartości).
Jak zauważyły inne odpowiedzi, możemy to zrobić
cd "./$(git rev-parse --show-cdup)"
, ale łamie się to w przypadku drugiej krawędzi (i przypadku trzeciej krawędzi, jeśli pominiemy podwójne cudzysłowy).Wiele powłok traktuje się
cd ""
jako brakcd "$(git rev-parse --show-cdup)"
operacji , więc w przypadku tych powłok możemy to zrobić (podwójne cudzysłowy chronią pusty ciąg znaków jako argument w przypadku pierwszej krawędzi i zachowują białe znaki w przypadku trzeciej krawędzi). POSIX twierdzi, że wynikcd ""
jest nieokreślony, więc najlepiej jest unikać tego założenia.Rozwiązanie, które działa we wszystkich powyższych przypadkach, wymaga pewnego rodzaju testu. Sporządzono jawnie, może to wyglądać następująco:
W
cd
przypadku pierwszej krawędzi nie jest wykonywane żadne działanie.Jeśli dopuszczalne jest uruchamianie
cd .
dla pierwszego przypadku krawędzi, wówczas warunek można wykonać w rozszerzeniu parametru:źródło
git root
', którego używa powyższa odpowiedź?Na wszelki wypadek, jeśli podajesz tę ścieżkę do samego Gita, użyj
:/
źródło
Krótkie rozwiązania, które działają z podmodułami, hakami i wewnątrz
.git
kataloguOto krótka odpowiedź, której większość będzie chciała:
Będzie to działać w dowolnym miejscu drzewa roboczego git (w tym w
.git
katalogu), ale zakłada, że katalog (y) repozytorium są nazywane.git
(co jest domyślne). W przypadku podmodułów nastąpi przejście do katalogu głównego najbardziej zewnętrznego repozytorium.Jeśli chcesz dostać się do katalogu głównego bieżącego submodułu użyj:
Aby łatwo wykonać polecenie w katalogu głównym podmodułu,
[alias]
w swoim.gitconfig
, dodaj:To pozwala łatwo robić takie rzeczy jak
git sh ag <string>
Solidne rozwiązanie, które obsługuje różne nazwy lub zewnętrzne
.git
lub$GIT_DIR
katalogi .Zauważ, że
$GIT_DIR
może wskazywać gdzieś na zewnątrz (i nie można go nazwać.git
), stąd potrzeba dalszego sprawdzania.Umieść to w
.bashrc
:Wykonać go przez pisanie
git_root
(po ponownym uruchomieniu powłoki:exec bash
)źródło
(root=$(git rev-parse --git-dir)/ && cd ${root%%/.git/*} && git rev-parse && pwd)
ale nie obejmuje to zewnętrznych$GIT_DIR
nazw, które są inne niż.git
Aby nieco zmienić „git config”, odpowiedz:
i wyczyść ścieżkę. Bardzo dobrze.
źródło
Jeśli szukasz dobrego aliasu, aby to zrobić, a także nie wysadzić w powietrze,
cd
jeśli nie jesteś w gitarze, reż:źródło
git-extras
dodaje
$ git root
patrz https://github.com/tj/git-extras/blob/master/Commands.md#git-root
Dostępność dodatków git
$ brew install git-extras
$ apt-get install git-extras
źródło
Ten alias powłoki działa niezależnie od tego, czy znajdujesz się w podkatalogu git, czy na najwyższym poziomie:
zaktualizowano, aby używało nowoczesnej składni zamiast backticks:
źródło
Wszystko inne zawodzi w pewnym momencie albo idzie do katalogu domowego, albo po prostu zawodzi. To najszybszy i najkrótszy sposób powrotu do GIT_DIR.
źródło
$GIT_DIR
zostanie odłączony od.git
drzewa roboczego za pomocą opcji -Files igitdir: SOMEPATH
. W konsekwencji nie powiedzie się to również w przypadku podmodułów, w których$GIT_DIR
zawiera.git/modules/SUBMODULEPATH
.Oto skrypt, który napisałem, który obsługuje oba przypadki: 1) repozytorium z obszarem roboczym, 2) samo repozytorium.
https://gist.github.com/jdsumsion/6282953
git-root
(plik wykonywalny na twojej ścieżce):Mam nadzieję, że jest to pomocne.
źródło
git exec
pomysł jest bardziej pomocny w repozytoriach innych niż nagie. Jednak ten skrypt w mojej odpowiedzi poprawnie obsługuje przypadek nagi i nie nagi, co może być przydatne dla kogoś, więc zostawiam tę odpowiedź tutaj.git submodule
s, gdzie$GIT_DIR
zawiera coś takiego/.git/modules/SUBMODULE
..git
Zakładasz również, że katalog jest częścią drzewa roboczego w przypadku, w którym nie jest nagi.źródło
[alias] findroot = "!f () { [[ -d ".git" ]] && echo "Found git in [
pwd]" && exit 0; cd .. && echo "IN
pwd" && f;}; f"
git config --global alias.root '!pwd'
działa. Nie byłem w stanie zauważyć żadnego przypadku, w którym działałby inaczej niż wariant nieglobalny. (Unix, git 1.7.10.4) BTW: Twójfindroot
wymaga/.git
, aby uniknąć nieskończonej rekurencji.Od wersji 2.13.0 Git obsługuje nową opcję wyświetlania ścieżki projektu głównego, która działa nawet wtedy, gdy jest używana z wnętrza submodułu:
źródło
Wstępnie skonfigurowane aliasy powłoki w środowisku szkieletowym
Jeśli używasz szkieletu powłoki, może być już dostępny alias powłoki:
$ grt
w oh-my-zsh (68k) (cd $(git rev-parse --show-toplevel || echo ".")
)$ git-root
in prezto (8.8k) (wyświetla ścieżkę do działającego katalogu głównego drzewa)$ g..
zimfw (1k) (zmienia bieżący katalog na najwyższy poziom działającego drzewa).źródło
Chciałem rozwinąć doskonały komentarz Daniela Brockmana.
Definiowanie
git config --global alias.exec '!exec '
pozwala robić takie rzeczy,git exec make
ponieważ, jakman git-config
stwierdza:Warto również wiedzieć, że
$GIT_PREFIX
będzie to ścieżka do bieżącego katalogu względem katalogu najwyższego poziomu repozytorium. Ale wiedząc, że to tylko połowa sukcesu ™. Zmienna ekspansja powłoki sprawia, że jest raczej trudny w użyciu. Sugerujębash -c
więc użycie w ten sposób:inne polecenia obejmują:
źródło
W przypadku, gdy ktoś potrzebuje tego sposobu zgodnego z POSIX, bez potrzeby
git
wykonywania pliku wykonywalnego:git-root
:Jeśli chcesz tylko funkcjonalność jako część skryptu, usuń shebang i zastąp ostatni
git_root_recurse_parent
wiersz:źródło
if
instrukcja miała sprawdzić, czy zmieniłeś katalog w rekursji. Jeśli pozostaje w tym samym katalogu, zakłada, że utknąłeś gdzieś (np./
) I hamuje rekurencję. Błąd został naprawiony i powinien działać zgodnie z oczekiwaniami. Dzięki za zwrócenie na to uwagi.Sam musiałem to dziś rozwiązać. Rozwiązałem go w języku C #, ponieważ potrzebowałem go do programu, ale myślę, że można go w zasadzie przepisać. Rozważ tę domenę publiczną.
źródło