Bunu yaptığımı söyle:
cd subdir
git init
cd ../
Bunu bir komutu çalıştırmak için bir dizine girip çıkarmak yerine tek bir komutla veya belki de iki ile yapmanın bir yolu var mı?
(Git'e özgü bir çözüm aramıyorum; bu sadece bir örnek.)
Bunu yaptığımı söyle:
cd subdir
git init
cd ../
Bunu bir komutu çalıştırmak için bir dizine girip çıkarmak yerine tek bir komutla veya belki de iki ile yapmanın bir yolu var mı?
(Git'e özgü bir çözüm aramıyorum; bu sadece bir örnek.)
Yanıtlar:
Bu genellikle en iyi yoldur:
( cd dir ; git init )
veya
( cd dir && git init )
Oldukça kısa ve yazması kolay. Bir alt kabuk başlatır, böylece ortamınızı bundan değiştiremezsiniz, ancak bu burada bir sorun gibi görünmüyor.
$?
alt kabukta çalışan son komutun çıkış kodunu içerecektir. &&
Varyantı kullanırsanız (genellikle kullanmanız gerekir), o zaman başarısız olan ilk komutun çıkış kodunu (veya hepsi yolunda giderse 0) alırsınız.
Git komutunu bir yoldan yürütmenin ve depoda farklı bir yolla değişiklikler yapmanın bir yolunu arıyordum. Bu yüzden burada bu soruyu bitirdim.
Ancak benim özel ihtiyaçlarım için ne kabul edilen cevap ne de diğerlerinden hiçbiri yardımcı olmadı.
Git komutlarını kullanarak çalıştırmam gerekiyordu sudo -u USER /usr/bin/git
(çalışan başka bir kullanıcı). Bildiğiniz gibi, sudo beni çalışmasına izin vermez cd
komutu, bu yüzden olamaz olmak depo dizininde.
Bu yüzden git'in erkek sayfasına gittim . Ve seçenekler arasında şunu gördüm --git-dir=<path>
:
--git-dir =
Depoya giden yolu ayarlayın. Bu, GIT_DIR ortam değişkenini ayarlayarak da kontrol edilebilir. Geçerli çalışma dizinine mutlak bir yol veya göreceli bir yol olabilir.
Yani, eğer birisine yardım ederse, hala bir yoldan git kullanabilir ve "sizden uzak" bir depoda değişiklikler yapabilirsiniz. Sadece kullan:
git --git-dir=/path/to/repository GIT_COMMAND
veya başka bir kullanıcı olarak çalıştırmak için aşağıdakileri yapın:
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository GIT_COMMAND
Ayrıca git-init'in man sayfasından :
$ GIT_DIR ortam değişkeni ayarlanmışsa, depo tabanı için ./.git yerine kullanılacak bir yol belirtir.
Bu nedenle, her zamanki .git klasörünün altındaki depoyu başlatmak istiyorsanız, bunu seçenekle birlikte belirtmeniz gerekir --git-dir
. Örneğin:
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository/.git init
Depoyu başlattıktan sonra /path/to/repo/.git
, tüm diğer komutlar --work-tree=<path>
git'in man sayfasında açıklandığı gibi seçeneğe sahip olmalıdır :
--work ağacı =
Çalışma ağacının yolunu ayarlayın. Geçerli çalışma dizinine göre mutlak bir yol veya yol olabilir. Bu, GIT_WORK_TREE ortam değişkenini ve core.worktree yapılandırma değişkenini ayarlayarak da kontrol edilebilir (daha ayrıntılı bir tartışma için git-config (1) 'deki core.worktree'ye bakın).
Dolayısıyla, git'i başka bir kullanıcı olarak çalıştırmak ve yeni bir veri havuzu başlatmak için doğru komut:
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository/.git init
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' add /path/to/repository/*
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' commit -m 'MESSAGE'
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' remote add origin user@domain.com:path
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' push -u origin master
sudo -i
veya sudo su
etkileşimli bir kök kabuğu almak için.
( cd subdir && sudo -u USER /usr/bin/git init )
işe yaramayacağını hayal edemiyorum .
subdir
?
Tam olarak ne sorduğunuzu değil (altta deniz kabuğu ile gerçek cevaplarınız var) ama bakın pushd
vepopd
Birkaç seçeneğin var. Komutları &&
veya ile gruplandırabilirsiniz ;
. Bunun gibi:
cd subdir && git init && cd ..
veya
cd subdir; git init; cd ..
Bunların arasındaki fark, ilk örnekte, komutlardan birinin başarısız olması durumunda, bunların geri kalanının yürütülmeyeceğidir. İkinci örnekte, ne olursa olsun tüm komutlar çalışacaktır.
Başka bir seçenek bir işlevi tanımlamak ve kullanmaktır, örneğin:
function cdinit() {
cd $1
git init
cd ..
}
Sonra komutu çalıştırabilirsiniz:
cdinit subdir
Ve otomatik git init
olarak bu dizinde olacak ve onun dışına taşınacak.
Bir grup diziniz varsa ve git init
bunlara tek bir komutla erişmek istiyorsanız, bir işlevi kullanarak daha karmaşık bir çözüm de yapabilirsiniz .
function cdinit() {
for arg in $@
do
cd $arg
git init
cd ..
done
}
Daha sonra bunu ile çalıştırabilirsiniz:
cdinit subdir1 subdir2 subdir3
Ve yapacak git init
yılında subdir1
, subdir2
ve subdir3
.
&&
ve ;
daha zarif bir şey umuyordum. Bir senaryo yazmak gibi görünüyor benim en iyi seçenek.
cdinit
Fonksiyonunuzun keyfi komutlar için genelleştirilebileceğini düşünüyor musunuz ? Sadece argümanları kullanmayı denedim, ama bu işe yaramadı.
;
, böylece üç satır işlevi eşdeğerdir cd $1; git init; cd ..
. (2) Eğer değişkenleri alıntı olmalıdır: "$1"
, "$@"
ve "$arg"
. Yoksa kısaltabilirsiniz for arg in "$@"
için for arg
.
Durumunda git
(en azından sürümü 2.7.0 olarak), yararlanabileceğiniz -C
bu verilen dizinde başlandı sanki git davranmak yapar seçeneği. Yani çözümünüz şöyle görünebilir:
> git -C subdir init
Initialized empty Git repository in /some/path/subdir/.git/
Belgelerin alıntılanması:
Run as if git was started in <path> instead of the current working directory. When multiple -C options are given, each subsequent non-absolute -C
<path> is interpreted relative to the preceding -C <path>.
This option affects options that expect path name like --git-dir and --work-tree in that their interpretations of the path names would be made
relative to the working directory caused by the -C option.
Komutları &&, örn.
cd subdir && git init && cd ../
Her komutun çıkış koduna bağımlılık istemiyorsanız, kullanabilirsiniz; bunun yerine, yani:
cd subdir ; git init ; cd ../
;
öncekilerin dönüş koduna bağlı kalmazlar.
cd subdir && git init ; cd ..
aslında en mantıklı gelebilir. Kullanıcı git init
komutu içinde subdir
çalıştırmak istiyorsa, muhtemelen komutu geçerli dizinde çalıştırmak istemez; yani, (ilk) cd
başarısız olursa çalıştırmak istemezler . (Bu mümkün olsa da o cd
biz çünkü başarısız zaten içinde subdir
, ama bu bir köşe dava.) ... (devamı)
cd
, git init
komut başarısız olsa bile başlangıç dizinine yedeklemek isteyebilir . ( Ya da alt dizininde kalmak ve komut hatası teşhis etmek isteyebilirsiniz.) (2) içermesi gerekmez /
sonra ..
.
Komutun bir dosya adı veya dizin adı parametresi yoksa hedef dizininize atlamanız gerekir.
Ancak, hedef dizini ve komutu parametre olarak alan bir bash betiği yazabilirsiniz. Bunun için pushd ve popd'a bakabilirsiniz: http://ss64.com/bash/pushd.html
O küçük senaryoyu senin için yazardım ama burada bir Linux kutum yok :)
Programların farklı argümanlarla başa çıkma yolları vardır, bu yüzden birkaç tanesinde -folder = name seçeneğinin bir eşdeğeri olacaktır . Bu istisnanın ötesinde, standart, hatta MS DOS’ta bile
$ program subdir
Bazen ihtiyacın var
$ program subdir /
Program klasörü açacak, onunla aynı dosya ile çalışacak şekilde çalışacak ve bitince, orijinal standart dizininizde belirtilen kabuğuna kontrolü geri gönderecektir. Bu şekilde ele alınan programlar DO hata çıktılarının (çekirdek dökümleri gibi) kabuğunuzun geçerli dizinindeki bir dosyaya gitmesine neden olur ( subdir .)
Programda farklı bir yer belirtmek için komut anahtarları bulunmadığı sürece geçici bir çözüm yoktur. Bazı programcılar “dizin programı çağrıldı ” ve “rehber program çalışması yapmaları isteniyor ” arasında sanatsal lisans aldı .