Saya ingin secara otomatis cd
ke direktori yang dibuat oleh clone
perintah setelah saya git clone
d sesuatu.
Penting: Saya tidak ingin mengubah sintaks untuk perintah (misalnya menggunakan alias / fungsi) karena itu akan merusak zsh-melengkapi saya dapatkan secara otomatis dari Pretzo
proyek.
EDIT : Alasan saya tidak memilih jawaban yang benar, adalah karena tidak ada jawaban yang memenuhi persyaratan di atas.
Saya menggunakan ZSH, tetapi jawaban di shell lain juga dapat diterima.
~/.bashrc
file (misalnya) dan bagi saya setidaknya itu tidak berfungsi, saya perlu memperbaikinya dengan mengganti baris:/usr/bin/git "$@" 2>&1 | tee $tmp
Jawaban:
Buat fungsi:
(Berfungsi untuk tautan baik dengan dan tanpa ".git")
sumber
git clone
karena semua alat yang harus saya ubah jika saya tidak menggunakangit
. Hub alias git, oh-my-zsh menyediakan penyelesaian otomatis, dll ...git
tidak dapat mengubah direktori kerja shell Anda, jadi Anda harus membungkusnya dengan alias / fungsi yang melakukan apa yang Anda inginkan dan mengikutinya dengan builtincd
. Jika Anda ingin meneleponhub
alih-alihgit
, lakukan di fungsi. Jika Anda hanya ingin memengaruhiclone
perintah, periksa tindakan di fungsi. dllbasename [email protected]:pckujawa/pattern-rec.git
menghasilkan pola-rec.git - apakah Anda meninggalkan ekstensi .git saat Anda mengkloning?basename
juga membutuhkan argumen sufiks, sehingga Anda dapat melakukan:git clone $1 && cd $(basename $1 .git)
git clone
membutuhkan argumen tambahan: direktori untuk digunakan. Anda dapat membuatnya klon ke direktori kerja saat ini dengangit clone URL .
Lalu, tidak perlu mengubah direktori kerja; kamu sudah ada di sana.Jika Anda benar-benar ingin
git
perintah untuk benar-benar mengubah direktori kerja, Anda dapat mengubahnya ke fungsi yang memanggil yang sebenarnyagit
saat diperlukan:sumber
/tmp
volume yang ada dalam RAM, seperti halnya Linux modern lainnya melalui tmpfs. Ngomong-ngomong, mengapa Anda peduli menulis ke disk, ketika Anda baru saja melakukan klon git, yang membuat direktori dan mungkin menulis ratusan file ke disk ...git [flags] command [arguments]
, jadi membabi buta memintaclone
pada posisi tertentu akan gagal.which git
git () {... $ git_real_home "$ @" | tee $ tmpJika Anda memberikan nama lokal dari repo itu, sangat mudah menggunakan $ _ :
Tetapi jika Anda tidak ingin mengetik ulang nama panjang, itu agak jelek tapi bisa dilakukan dengan sed:
EDIT: Ya, saya akan berterima kasih kepada Manav (komentar di bawah) untuk singkatnya
tetapi itu tidak bekerja di zsh (sesuatu tentang bagaimana zsh melakukan ekspansi menyebabkannya tidak memperlakukan perintah pertama sebagai input ke
!$
). Saya harus mencari tahu apa yang!$:t
terjadi ( Memajukan dalam Bash Shell | $ {me: -apapun} ).!$
ambil bagian terakhir dari perintah sebelumnya dan:t
akan "Hapus semua komponen nama file terkemuka, biarkan ekor." Informasi yang bagus, tetapi saya berharap saya bisa membuatnya bekerja dengan zsh (saya mencobanoglob
tanpa hasil).EDIT: Alih-alih menggunakan
sed
atau!$:t
(yang tidak berfungsi di zsh, bagi saya toh), saya menemukan dua opsi lain (satu mengadaptasi https://unix.stackexchange.com/users/5685/frederik-deweerdt jawaban dengan https : //unix.stackexchange.com/users/129926/henrik-n komentar):atau
sumber
git clone foo/bar && cd !$:t
.git
Anda dapat menggunakan!$:t:r
untuk mendapatkan nama folder.Solusi sederhana untuk setiap shell POSIX adalah menentukan direktori yang akan dikloning secara eksplisit (jalur sistem file apa pun) dan menggunakannya kembali:
dan
ketika kamu selesai.
sumber
Anda dapat melakukan sesuatu seperti:
Ini sangat sederhana. Ini adalah
precmd
pengait (dijalankan sebelum setiap prompt), yang memeriksa apakah baris perintah terakhir terlihat sepertigit clone .../something
ataugit clone .../something dir
, tebak direktori dari itu dan masukkan ke dalamnya.Tidak bekerja jika Anda memasukkan
git clone foo; whatever
atauwhatever; git clone foo
ataugit clone --option repo
...sumber
CDing into <project>
danclone_check:cd:17: no such file or directory: <project>
. Kesalahan menghilang segera setelah perintah terakhir yang Anda jalankan sebelum menutup terminal berbeda$ git clone
.Berikut adalah adaptasi dari jawaban di atas untuk
OSX
mktemp
memerlukan parameter tambahangit clone
menulis keSTDERR
secara default (lihat ini )Fungsi:
sumber
Saya tidak akan merekomendasikannya, tetapi Anda bisa menggunakan ini satu-liner:
echo 'project' | xargs -I % sh -c 'git clone https://github.com/username/%.git && cd %'
sumber
Sertakan ini di shell Anda:
Ini bekerja dengan secara diam-diam mengumpulkan target kloning dari kesalahan standar git dan
cd
memasuki target jika (dan hanya jika) kloning berhasil.Ia menerima semua argumen dan opsi yang biasa
git clone
dilakukan.Entah Anda bisa menggunakan pembungkus git dan tidak perlu khawatir tentang kelengkapan Anda, atau Anda bisa menyingkirkan pembungkus git dan rewire
git clone
kelengkapan Anda untukgit-clone
.sumber