Chcę automatycznie cd
przejść do katalogu utworzonego przez clone
polecenie po git clone
czymś.
Ważne: nie chcę zmieniać składni polecenia (np. Użyć aliasu / funkcji), ponieważ spowodowałoby to przerwanie uzupełnień zsh, które otrzymuję automatycznie z Pretzo
projektu.
EDYCJA : Powodem, dla którego nie wybrałem żadnej odpowiedzi jako poprawnej, jest to, że nie podano żadnej odpowiedzi, która byłaby zgodna z powyższym warunkiem.
Używam ZSH, ale odpowiedź w dowolnej innej powłoce jest również do przyjęcia.
~/.bashrc
pliku (na przykład) i dla mnie przynajmniej nie działała, musiałem to naprawić, zastępując linia:/usr/bin/git "$@" 2>&1 | tee $tmp
Odpowiedzi:
Utwórz funkcję:
(Działa z linkami zarówno z „.git”, jak i bez niego)
źródło
git clone
ze względu na wszystkie narzędzia, które musiałbym zmienić, gdybym nie korzystałgit
. Hub jest aliasowany jako git, oh-my-zsh zapewnia automatyczne uzupełnianie itp.git
nie może zmienić katalogu roboczego twojej powłoki, więc tak czy inaczej będziesz musiał owinąć go w alias / funkcję, która robi to, co chcesz i śledzi to za pomocą wbudowanegocd
. Jeśli chcesz zadzwonićhub
zamiastgit
, zrób to w funkcji. Jeśli chcesz, aby wpływał tylko naclone
polecenie, sprawdź działanie w funkcji. itp.basename [email protected]:pckujawa/pattern-rec.git
powoduje to wzorzec-rec.git - czy po prostu zostawiasz rozszerzenie .git podczas klonowania?basename
bierze również argument sufiksu, dzięki czemu możesz:git clone $1 && cd $(basename $1 .git)
git clone
przyjmuje dodatkowy argument: katalog do użycia. Możesz go sklonować do bieżącego katalogu roboczego za pomocągit clone URL .
Następnie nie ma potrzeby zmiany katalogu roboczego; już tam jesteśJeśli naprawdę chcesz, aby
git
polecenie zmieniło katalog roboczy, możesz zmienić go na funkcję, która wgit
razie potrzeby wywołuje rzeczywistą :źródło
/tmp
wolumin znajdujący się w pamięci RAM, tak jak każdy współczesny Linux robi to przez tmpfs. W każdym razie, dlaczego miałbyś przejmować się pisaniem na dysk, skoro właśnie zrobiłeś klon git, który tworzy katalogi i zapisuje może setki plików na dysk ...git [flags] command [arguments]
, więc ślepe proszenie oclone
określone stanowisko zawiedzie.which git
git () {... $ git_real_home "$ @" | tee $ tmpJeśli podasz lokalną nazwę repozytorium, użycie $ _ jest naprawdę łatwe :
Ale jeśli nie chcesz ponownie wpisywać długich nazw, jest to trochę brzydkie, ale wykonalne za pomocą sed:
EDYCJA: Cóż, chciałem podziękować Manavowi (komentarz poniżej) za zwięzłość
ale to nie działa w zsh (coś o tym, jak zsh robi rozwinięcia powoduje, że nie traktuje pierwszego polecenia jako danych wejściowych
!$
). Musiałem sprawdzić, co się stało!$:t
( Awans w Bash Shell | $ {ja: -wszystko} ).!$
pobiera ostatnią część poprzedniego polecenia i:t
„Usuwa wszystkie wiodące komponenty nazw plików, pozostawiając ogon”. Dobra informacja, ale szkoda, że nie mogę tego zrobić z zsh (próbowałemnoglob
bezskutecznie).EDIT: Zamiast
sed
lub!$:t
(co nie działa w zsh, przynajmniej dla mnie), znalazłem dwie inne opcje (jeden dostosowująca https://unix.stackexchange.com/users/5685/frederik-deweerdt „s odpowiedź z https : //unix.stackexchange.com/users/129926/henrik-n's comment):lub
źródło
git clone foo/bar && cd !$:t
.git
, możesz użyć!$:t:r
nazwy folderu.Prostym rozwiązaniem dla dowolnej powłoki POSIX jest jawne określenie katalogu do klonowania (dowolna ścieżka systemu plików) i ponowne użycie go:
i
kiedy skończysz.
źródło
Możesz zrobić coś takiego:
To jest dość uproszczone. Jest to
precmd
haczyk (wykonywany przed każdym monitem), który sprawdza, czy wyglądał ostatni wiersz poleceniagit clone .../something
lubgit clone .../something dir
, zgadnij z niego katalog i włóż do niego cd.To nie działa, jeśli wprowadzone
git clone foo; whatever
lubwhatever; git clone foo
czygit clone --option repo
...źródło
CDing into <project>
iclone_check:cd:17: no such file or directory: <project>
. Błąd znika, gdy tylko ostatnie polecenie uruchomione przed zamknięciem terminalu różni się od$ git clone
.Oto adaptacja powyższej odpowiedzi dla
OSX
mktemp
wymaga dodatkowego parametrugit clone
STDERR
domyślnie zapisuje (patrz to )Funkcjonować:
źródło
Nie polecam go, ale mógłby użyć tego jednego-liner:
echo 'project' | xargs -I % sh -c 'git clone https://github.com/username/%.git && cd %'
źródło
Dodaj to do swojej powłoki:
Działa to poprzez ukryte pozyskiwanie celu klonowania ze standardowego błędu gita i
cd
trafianie do celu, jeśli (i tylko jeśli) klonowanie zakończyło się sukcesem.Akceptuje wszystkie argumenty i opcje, które
git clone
robi normalny .Albo możesz użyć otoki git i nie musisz się martwić o swoje ukończenia, albo możesz pozbyć się otoki git i ponownie
git clone
wykonać okablowaniegit-clone
.źródło