Powiedz, że to robię:
cd subdir
git init
cd ../
Czy istnieje sposób, aby to zrobić za pomocą jednego polecenia, a może dwóch, zamiast wchodzenia i wychodzenia z katalogu w celu uruchomienia polecenia?
(Nie szukam rozwiązania specyficznego dla git; to tylko przykład.)
$?
będzie zawierać kod zakończenia ostatniego polecenia uruchomionego w podpowłoce. Jeśli użyjesz&&
wariantu (co zwykle powinieneś), otrzymasz kod wyjścia dla pierwszego polecenia, które się nie powiodło (lub 0, jeśli wszystko poszło dobrze).Szukałem sposobu wykonania polecenia git ze ścieżki i wprowadzenia zmian w repozytorium inną ścieżką. Skończyło się na tym pytaniu tutaj.
Ale w przypadku moich konkretnych potrzeb ani zaakceptowana odpowiedź, ani żadna z pozostałych nie pomogła.
Musiałem uruchamiać polecenia git przy użyciu
sudo -u USER /usr/bin/git
(inny użytkownik go uruchamiający). I jak zapewne wiesz, sudo nie pozwala mi na uruchomieniecd
polecenia, więc nie mogę znajdować się w katalogu repozytorium.Poszedłem na stronę podręcznika użytkownika git . Wśród opcji widziałem
--git-dir=<path>
:Jeśli więc komuś pomoże, nadal możesz używać git ze ścieżki i wprowadzać zmiany w repozytorium „daleko od ciebie”. Po prostu użyj:
lub, aby uruchomić go jako inny użytkownik, wykonaj coś takiego:
Również ze strony man git-init :
Jeśli więc chcesz zainicjować repozytorium w zwykłym folderze .git, musisz określić go wraz z
--git-dir
opcją. na przykład:Po zainicjowaniu repozytorium
/path/to/repo/.git
wszystkie dalsze komendy powinny mieć opcję--work-tree=<path>
opisaną na stronie man git:Tak więc właściwym poleceniem do uruchomienia git jako innego użytkownika i zainicjowania nowego repozytorium jest:
źródło
sudo -i
lubsudo su
uzyskać interaktywną powłokę root.( cd subdir && sudo -u USER /usr/bin/git init )
nie miałbym działać.subdir
?Nie do końca to, o co pytasz (masz prawdziwe odpowiedzi powyżej z podpowłoką), ale spójrz na
pushd
ipopd
źródło
Masz kilka opcji. Możesz pogrupować polecenia za pomocą
&&
lub;
. Lubię to:lub
Różnica między nimi polega na tym, że w pierwszym przykładzie, jeśli jedno z poleceń nie powiedzie się, nie wykona pozostałych. W drugim przykładzie wszystkie polecenia będą działać bez względu na wszystko.
Inną opcją byłoby zdefiniowanie funkcji i użycie jej, na przykład:
Następnie możesz uruchomić polecenie:
I automatycznie znajdzie się
git init
w tym katalogu i się z niego wyprowadzi.Możesz również zrobić bardziej złożone rozwiązanie za pomocą funkcji, jeśli masz kilka katalogów i chcesz
git init
je za pomocą jednego polecenia.Następnie możesz uruchomić to za pomocą:
I będzie to robić
git init
wsubdir1
,subdir2
isubdir3
.źródło
&&
i;
, ale nadzieję na coś bardziej eleganckiego. Brzmi jak napisanie skryptu to moja najlepsza opcja.cdinit
funkcja może być uogólniona dla dowolnych poleceń? Próbowałem użyć tylko argumentów, ale to nie zadziałało.;
linia jest równoważna, tak że funkcja trzywierszowa jest równoważnacd $1; git init; cd ..
. (2) Należy zacytować zmienne:"$1"
,"$@"
i"$arg"
. Lub możesz skrócićfor arg in "$@"
dofor arg
.W przypadku
git
(przynajmniej w wersji 2.7.0) możesz skorzystać z-C
opcji, która powoduje, że git zachowuje się tak, jakby został uruchomiony w danym katalogu. Twoje rozwiązanie może wyglądać następująco:Cytując dokumentację:
źródło
Możesz pogrupować polecenia za pomocą &&, tj
Jeśli nie chcesz żadnej zależności od kodu wyjścia każdej komendy, możesz użyć; zamiast tego, tj .:
źródło
;
tak, aby nie zależały od kodu powrotu poprzedniego.cd subdir && git init ; cd ..
może mieć sens. Jeśli użytkownik chce uruchomićgit init
polecenie wsubdir
, prawdopodobnie nie chce uruchomić polecenia w bieżącym katalogu; tzn. nie chcą go uruchamiać, jeśli (pierwszy)cd
zawiedzie. (Chociaż to możliwe, żecd
nie dlatego, że jesteśmy już wsubdir
, ale to przypadek rogu.) ... (ciąg dalszy)cd
kopię zapasową w katalogu startowym, nawet jeśligit init
polecenie się nie powiedzie. ( Lub mogą chcieć pozostać w podkatalogu i zdiagnozować błąd polecenia.) (2) Nie musisz uwzględniać/
później..
.Musisz wskoczyć do katalogu docelowego, jeśli polecenie nie ma parametru nazwy pliku lub nazwy katalogu.
Ale możesz napisać skrypt bash, który przyjmuje katalog docelowy i polecenie jako parametry. W tym celu możesz spojrzeć na pushd i popd: http://ss64.com/bash/pushd.html
Napisałbym dla ciebie ten mały skrypt, ale nie mam tu Linux-a :)
źródło
Programy mają różne sposoby obsługi argumentów, więc niektóre będą miały odpowiednik opcji -folder = nazwa . Poza tym wyjątkiem standard, nawet w MS DOS, jest po prostu
$ program podkatalog
Czasem potrzebujesz
katalog programu $ /
Program otworzy folder, będzie pracował z nim w taki sam sposób, jak z plikiem, a po zakończeniu zwróci kontrolę do powłoki, która jest wskazana na oryginalny katalog standardowy. Programy obsługiwane w ten sposób mają problem z tym, że dane wyjściowe błędów (takie jak zrzuty pamięci) trafiają do pliku w bieżącym katalogu powłoki (zamiast podkatalogu ).
Nie można obejść tego problemu, chyba że program ma dostępne przełączniki poleceń określające inne miejsce. Niektórzy programiści biorą licencję artystyczną pomiędzy „program katalogowy został wywołany z ” a „program katalogowy został poproszony o pracę ”.
źródło