Katakan bahwa saya melakukan ini:
cd subdir
git init
cd ../
Apakah ada cara untuk melakukan ini dengan satu perintah, atau mungkin dua, daripada harus masuk dan keluar dari direktori untuk menjalankan perintah di sana?
(Tidak mencari solusi spesifik git; itu hanya contoh.)
$?
akan berisi kode keluar dari perintah terakhir yang dijalankan di subkulit. Jika Anda menggunakan&&
varian (yang biasanya Anda harus), maka Anda akan mendapatkan kode keluar dari perintah pertama yang gagal (atau 0 jika semua berjalan ok).Saya mencari cara untuk mengeksekusi perintah git dari sebuah path, dan membuat perubahan pada repositori di path yang berbeda. Jadi saya berakhir dengan pertanyaan ini di sini.
Tetapi untuk kebutuhan spesifik saya, baik jawaban yang diterima maupun yang lain tidak membantu.
Saya perlu menjalankan perintah git menggunakan
sudo -u USER /usr/bin/git
(pengguna lain yang menjalankannya). Dan seperti yang Anda ketahui, sudo tidak mengizinkan saya menjalankancd
perintah, jadi saya tidak bisa berada di direktori repositori.Jadi, saya pergi ke halaman manual git . Dan di antara beberapa opsi, saya melihat
--git-dir=<path>
:Jadi, jika itu membantu seseorang, Anda masih bisa menggunakan git dari path dan membuat perubahan pada repositori "jauh dari Anda". Cukup gunakan:
atau, untuk menjalankannya sebagai pengguna lain, lakukan sesuatu seperti:
Juga dari halaman manual git-init :
Jadi, jika Anda ingin init repositori di bawah folder .git yang biasa, Anda harus menentukannya bersama dengan
--git-dir
opsi. misalnya:Setelah menginisialisasi repositori
/path/to/repo/.git
, semua perintah lebih lanjut harus memiliki opsi--work-tree=<path>
, seperti yang dijelaskan pada halaman manual git:Jadi, perintah yang tepat untuk menjalankan git sebagai pengguna lain, dan menginisialisasi repositori baru adalah:
sumber
sudo -i
atausudo su
untuk mendapatkan shell root interaktif.( cd subdir && sudo -u USER /usr/bin/git init )
tidak berhasil.subdir
?Tidak persis apa yang Anda minta (Anda memiliki jawaban nyata di atas dengan subkulit) tetapi lihat
pushd
danpopd
sumber
Anda punya beberapa pilihan. Anda dapat mengelompokkan perintah dengan
&&
atau;
. Seperti ini:atau
Perbedaannya adalah dalam contoh pertama, jika salah satu perintah gagal, ia tidak akan menjalankan sisanya. Dalam contoh kedua, semua perintah akan berjalan apa pun yang terjadi.
Opsi lain adalah mendefinisikan fungsi dan menggunakannya, misalnya:
Kemudian Anda dapat menjalankan perintah:
Dan itu akan secara otomatis
git init
di direktori itu dan keluar.Anda juga bisa melakukan solusi yang lebih kompleks menggunakan fungsi jika Anda memiliki banyak direktori dan ingin
git init
mereka dengan satu perintah.Anda kemudian dapat menjalankan ini dengan:
Dan akan melakukan
git init
disubdir1
,subdir2
, dansubdir3
.sumber
&&
dan;
, tetapi berharap untuk sesuatu yang lebih elegan. Kedengarannya seperti menulis naskah adalah pilihan terbaik saya.cdinit
fungsi Anda dapat digeneralisasi untuk perintah yang sewenang-wenang? Saya mencoba menggunakan argumen saja, tetapi itu tidak berhasil.;
, sehingga fungsi tiga baris setara dengancd $1; git init; cd ..
. (2) Anda harus mengutip variabel Anda:"$1"
,"$@"
dan"$arg"
. Atau Anda dapat menyingkatfor arg in "$@"
kefor arg
.Dalam hal
git
(setidaknya dalam versi 2.7.0), Anda dapat memanfaatkan-C
opsi yang membuat git berperilaku seolah-olah itu dimulai di direktori yang diberikan. Jadi solusi Anda mungkin terlihat seperti:Mengutip dokumentasi:
sumber
Anda dapat mengelompokkan perintah dengan &&, yaitu
Jika Anda tidak ingin ada ketergantungan pada kode keluar dari setiap perintah, Anda dapat menggunakan; sebaliknya, yaitu:
sumber
;
begitu mereka tidak bergantung pada kode pengembalian yang sebelumnya.cd subdir && git init ; cd ..
sebenarnya mungkin paling masuk akal. Jika pengguna ingin menjalankangit init
perintah disubdir
, maka mereka mungkin tidak ingin menjalankan perintah di direktori saat ini; yaitu, mereka tidak ingin menjalankannya jika (pertama)cd
gagal. (Meskipun ada kemungkinan bahwacd
gagal karena kita sudah disubdir
, tapi itu kasus sudut.) ... (Lanjutan)cd
membuat cadangan ke direktori awal bahkan jikagit init
perintah gagal. ( Atau, mereka mungkin ingin tinggal di subdirektori dan mendiagnosa kegagalan perintah.) (2) Anda tidak perlu menyertakan/
setelah..
.Anda harus masuk ke direktori target Anda jika perintah tidak memiliki parameter nama file atau nama direktori.
Tetapi Anda dapat menulis skrip bash yang mengambil direktori target dan perintah sebagai parameter. Untuk ini, Anda bisa melihat pushd dan popd: http://ss64.com/bash/pushd.html
Saya akan menulis skrip kecil itu untuk Anda, tetapi saya tidak memiliki kotak Linux di sini :)
sumber
Program memiliki cara penanganan argumen yang berbeda, sehingga beberapa akan memiliki opsi -folder = nama yang setara . Di luar pengecualian itu, standarnya, bahkan pada MS DOS, adalah sederhana
$ subdir program
Terkadang Anda membutuhkannya
$ subdir program /
Program akan membuka folder, bekerja dengannya seperti halnya Anda bekerja dengan file, dan setelah selesai, kembalikan kontrol ke shell Anda, yang diarahkan ke direktori standar asli Anda. Program-program yang ditangani dengan cara ini DO memiliki masalah bahwa output kesalahan (seperti dump inti) pergi ke file di direktori shell Anda saat ini (bukan subdir .)
Tidak ada solusi kecuali program memiliki sakelar perintah yang tersedia untuk menentukan tempat yang berbeda. Beberapa programmer mengambil lisensi artistik antara "program direktori dipanggil dari " dan "program direktori disuruh bekerja ."
sumber