Mercurial memiliki cara mencetak direktori root (yang berisi .hg) via
hg root
Apakah ada sesuatu yang setara di git untuk mendapatkan direktori yang berisi direktori .git?
git
version-control
Wojo
sumber
sumber
bzr root
banyak digunakan di Bazaargit rev-parse --git-dir
, seperti yang dijelaskan dalam komentar iniJawaban:
Iya:
Jika Anda ingin meniru perintah Git secara lebih langsung, Anda dapat membuat alias :
dan sekarang
git root
akan berfungsi samahg root
.Catatan : Dalam submodule ini akan menampilkan direktori root dari submodule dan bukan repositori induk. Jika Anda menggunakan Git> = 2.13 atau di atas, ada cara agar submodula dapat menampilkan direktori root superproject. Jika git Anda lebih tua dari itu, lihat jawaban lain ini.
sumber
git config --global alias.exec '!exec '
sehingga saya bisa melakukan hal-hal sepertigit exec make
. Ini berfungsi karena alias shell selalu dijalankan di direktori tingkat atas.hg root
dilakukan. Mencetak direktori tingkat atas dari repositori Anda yang sudah diperiksa. Itu tidak mengalihkan Anda ke sana (dan itu tidak bisa, pada kenyataannya, melakukannya karena bagaimana seluruh konsep direktori saat ini dan shell Anda berinteraksi).~/my.proj/foo/bar
, dan~/my.proj
terhubung ke~/src/my.proj
, perintah di atas akan memindahkan Anda ke~/src/my.proj
. Bisa jadi masalah, jika apa pun yang ingin Anda lakukan setelah itu bukan pohon agnostik..git
direktori proyek .The
man
halaman untukgit-config
(di bawah Alias ) mengatakan:Jadi, pada UNIX Anda dapat melakukan:
sumber
.zshrc
, dan saya mendefinisikan `alias cg =" cd $ (git root) ", bagian $ () akan dievaluasi pada waktu sumber, dan selalu menunjuk ke ~ / dotfiles, karena di situlah zshrc saya berada .Telah
--show-toplevel
hanya baru-baru telah ditambahkan kegit rev-parse
atau mengapa tidak ada yang menyebutkan itu?Dari
git rev-parse
halaman manual:sumber
git-rev-parse
- karena namanya menyarankan untuk memproses spesifikasi revisi. BTW, saya akan senang melihatgit --work-tree
karya yang mirip dengangit --exec-path[=<path>]
: "Jika tidak ada jalur yang diberikan, git akan mencetak pengaturan saat ini"; setidaknya, IMO, itu akan menjadi tempat yang logis untuk mencari fitur seperti itu.root = rev-parse --show-toplevel
di gitconfig Anda.git config --global alias.root "rev-parse --show-toplevel"
dan kemudiangit root
akan dapat melakukan pekerjaangit rev-parse --show-toplevel
bekerja ketika saya mencobanya dalam sebuah submodule. Ini mencetak direktori root dari submitule git. Apa yang tercetak untuk Anda?--show-cdup
ke--show-top-level
Februari 2011 (setelah jawaban ini diajukan).Bagaimana dengan "
git rev-parse --git-dir
"?Itu
--git-dir
pilihan tampaknya bekerja.Dari halaman manual git rev-parse :
Anda dapat melihatnya beraksi di skrip ini
git setup-sh
.Jika Anda berada di folder submodule, dengan Git> = 2.13 , gunakan :
Jika Anda menggunakan
git rev-parse --show-toplevel
, pastikan dengan Git 2.25+ (Q1 2020) .sumber
.git
jika Anda sudah berada di direktori root. (Setidaknya, itu pada msysgit.)Untuk menulis jawaban sederhana di sini, sehingga bisa kita gunakan
untuk melakukan pekerjaan itu, cukup konfigurasikan git Anda dengan menggunakan
dan kemudian Anda mungkin ingin menambahkan yang berikut ke
~/.bashrc
:sehingga Anda bisa menggunakan
cdroot
untuk pergi ke atas repo Anda.sumber
Jika Anda sudah berada di level atas atau tidak dalam repositori git
cd $(git rev-parse --show-cdup)
akan membawa Anda pulang (hanya cd).cd ./$(git rev-parse --show-cdup)
adalah salah satu cara untuk memperbaikinya.sumber
cd "$(git rev-parse --show-cdup)"
. Ini bekerja karenacd ""
membawa Anda ke mana-mana, daripada kembali$HOME
. Dan itu praktik terbaik untuk mengutip doa $ (), kalau-kalau mereka mengeluarkan sesuatu dengan spasi (meskipun perintah ini tidak akan dalam kasus ini).$PWD
. Contoh ini akan menyelesaikan root relatif git$PWD
daripadarealpath $PWD
.Untuk menghitung path absolut dari direktori root git saat ini, katakan untuk digunakan dalam skrip shell, gunakan kombinasi readlink dan git rev-parse:
git-rev-parse --show-cdup
memberi Anda jumlah yang tepat ".." untuk sampai ke root dari cwd Anda, atau string kosong jika Anda berada di root. Kemudian tambahkan "./" untuk menangani case string kosong dan gunakanreadlink -f
untuk menerjemahkan ke path lengkap.Anda juga bisa membuat
git-root
perintah di PATH Anda sebagai skrip shell untuk menerapkan teknik ini:(Di atas dapat disisipkan ke terminal untuk membuat git-root dan mengatur bit eksekusi; skrip yang sebenarnya ada di baris 2, 3 dan 4.)
Dan kemudian Anda bisa berlari
git root
untuk mendapatkan root dari pohon Anda saat ini. Perhatikan bahwa dalam skrip shell, gunakan "-e" untuk menyebabkan shell keluar jika rev-parse gagal sehingga Anda bisa mendapatkan status keluar dan pesan kesalahan dengan benar jika Anda tidak berada di direktori git.sumber
"$(git rev-parse ...)"
bukan seperti peretasan./$(git rev-parse ...)
.readlink -f
tidak berfungsi sama pada BSD. Lihat SO ini untuk penyelesaiannya. Python Jawabannya mungkin akan bekerja tanpa harus memasang apapun:python -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' "$(git rev-parse --show-cdup)"
.Seperti yang telah dicatat oleh orang lain, inti dari solusi adalah menggunakan
git rev-parse --show-cdup
. Namun, ada beberapa kasus tepi yang harus diatasi:Ketika cwd sudah menjadi root dari pohon yang bekerja, perintah menghasilkan string kosong.
Sebenarnya itu menghasilkan baris kosong, tetapi perintah strip pengganti dari istirahat garis trailing. Hasil akhir adalah string kosong.
Sebagian besar jawaban menyarankan untuk mengawali output dengan
./
sehingga output kosong menjadi"./"
sebelum diumpankan kecd
.Ketika GIT_WORK_TREE diatur ke lokasi yang bukan induk dari cwd, output mungkin merupakan nama path absolut.
Ketergantungan
./
adalah salah dalam situasi ini. Jika a./
adalah prepended ke path absolut, itu menjadi path relatif (dan mereka hanya merujuk ke lokasi yang sama jika cwd adalah direktori root sistem).Output mungkin berisi spasi.
Ini benar-benar hanya berlaku dalam kasus kedua, tetapi memiliki perbaikan yang mudah: gunakan tanda kutip ganda di sekitar substitusi perintah (dan setiap penggunaan selanjutnya dari nilai).
Seperti yang dicatat oleh jawaban lain, kita bisa melakukannya
cd "./$(git rev-parse --show-cdup)"
, tetapi hal ini pecah pada case tepi kedua (dan case edge ketiga jika kita mengabaikan tanda kutip ganda).Banyak shell memperlakukan
cd ""
sebagai no-op, jadi untuk shell yang bisa kita lakukancd "$(git rev-parse --show-cdup)"
(tanda kutip ganda melindungi string kosong sebagai argumen dalam case tepi pertama, dan mempertahankan spasi putih di case tepi ketiga). POSIX mengatakan hasil daricd ""
tidak ditentukan, jadi mungkin yang terbaik adalah menghindari membuat asumsi ini.Sebuah solusi yang bekerja dalam semua kasus di atas memerlukan semacam tes. Dilakukan secara eksplisit, mungkin terlihat seperti ini:
Tidak
cd
dilakukan untuk kasing tepi pertama.Jika dapat dijalankan
cd .
untuk case tepi pertama, maka kondisional dapat dilakukan dalam perluasan parameter:sumber
git root
' yang jawaban di atas Anda gunakan?Untuk berjaga-jaga jika Anda memberi makan jalur ini ke Git itu sendiri, gunakan
:/
sumber
Solusi singkat yang bekerja dengan submodula, di kait, dan di dalam
.git
direktoriInilah jawaban singkat yang paling diinginkan:
Ini akan bekerja di mana saja di pohon kerja git (termasuk di dalam
.git
direktori), tetapi mengasumsikan bahwa direktori repositori dipanggil.git
(yang merupakan default). Dengan submodula, ini akan menuju ke akar repositori yang mengandung paling luar.Jika Anda ingin mendapatkan root dari submodule saat ini:
Untuk dengan mudah menjalankan perintah di root submodule Anda,
[alias]
di bawah di Anda.gitconfig
, tambahkan:Ini memungkinkan Anda untuk dengan mudah melakukan hal-hal seperti
git sh ag <string>
Solusi yang kuat yang mendukung nama yang berbeda atau eksternal
.git
atau$GIT_DIR
direktori.Perhatikan bahwa
$GIT_DIR
mungkin menunjuk suatu tempat eksternal (dan tidak bisa disebut.git
), maka kebutuhan untuk pemeriksaan lebih lanjut.Letakkan ini di
.bashrc
:Jalankan dengan mengetik
git_root
(setelah restart shell Anda:exec bash
)sumber
(root=$(git rev-parse --git-dir)/ && cd ${root%%/.git/*} && git rev-parse && pwd)
tetapi ini tidak mencakup eksternal$GIT_DIR
yang dinamai selain.git
Untuk sedikit mengubah jawaban "git config":
dan membersihkan jalan. Sangat bagus.
sumber
Jika Anda mencari alias yang baik untuk melakukan ini dan tidak meledak
cd
jika Anda tidak berada di direktori git:sumber
git-extras
menambahkan
$ git root
lihat https://github.com/tj/git-extras/blob/master/Commands.md#git-root
Ketersediaan git-ekstra
$ brew install git-extras
$ apt-get install git-extras
sumber
Alias shell ini berfungsi baik Anda berada di subdit git, atau di tingkat atas:
diperbarui untuk menggunakan sintaksis modern alih-alih backticks:
sumber
Segala sesuatu yang lain gagal pada beberapa titik, entah menuju ke direktori home atau gagal total. Ini adalah cara tercepat dan terpendek untuk kembali ke GIT_DIR.
sumber
$GIT_DIR
terlepas dari pohon kerja menggunakan.git
-Files dangitdir: SOMEPATH
. Akibatnya ini gagal untuk submodules, juga, di mana$GIT_DIR
mengandung.git/modules/SUBMODULEPATH
.Berikut ini adalah skrip yang saya tulis yang menangani kedua kasus: 1) repositori dengan ruang kerja, 2) repositori kosong.
https://gist.github.com/jdsumsion/6282953
git-root
(file yang dapat dieksekusi di jalur Anda):Semoga ini bermanfaat.
sumber
git exec
idenya lebih membantu dalam repositori non-telanjang. Namun, skrip ini dalam jawaban saya menangani bare vs non-bare case dengan benar, yang dapat bermanfaat bagi seseorang, jadi saya meninggalkan jawaban ini di sini.git submodule
di mana$GIT_DIR
berisi sesuatu seperti/.git/modules/SUBMODULE
. Anda juga berasumsi, bahwa.git
direktori adalah bagian dari worktree dalam case non-bare.sumber
[alias] findroot = "!f () { [[ -d ".git" ]] && echo "Found git in [
pwd]" && exit 0; cd .. && echo "IN
pwd" && f;}; f"
git config --global alias.root '!pwd'
bekerja. Saya tidak dapat menemukan kasus mana pun yang berfungsi secara berbeda terhadap varian non-global. (Unix, git 1.7.10.4) BTW: Andafindroot
membutuhkan/.git
untuk menghindari rekursi yang tak berkesudahan.Sejak Git 2.13.0 , ia mendukung opsi baru untuk menunjukkan jalur proyek root, yang bekerja bahkan ketika digunakan dari dalam submodule:
sumber
Alias Shell Pra-Konfigurasi dalam Kerangka Shell
Jika Anda menggunakan kerangka shell, mungkin sudah ada alias shell yang tersedia:
$ grt
dalam oh-my-zsh (68k) (cd $(git rev-parse --show-toplevel || echo ".")
)$ git-root
di prezto (8.8k) (menampilkan path ke root tree yang berfungsi)$ g..
zimfw (1k) (mengubah direktori saat ini ke tingkat teratas pohon yang berfungsi.)sumber
Saya ingin memperluas komentar luar biasa Daniel Brockman.
Mendefinisikan
git config --global alias.exec '!exec '
memungkinkan Anda untuk melakukan hal-hal sepertigit exec make
karena, seperti yangman git-config
dinyatakan:Juga berguna untuk mengetahui bahwa itu
$GIT_PREFIX
akan menjadi jalur ke direktori saat ini relatif ke direktori tingkat atas dari repositori. Tapi, mengetahui itu hanya setengah dari pertempuran ™. Ekspansi variabel Shell membuatnya agak sulit digunakan. Jadi saya sarankan menggunakanbash -c
seperti:perintah lain termasuk:
sumber
Jika ada yang membutuhkan cara yang sesuai dengan POSIX untuk melakukan ini, tanpa perlu
git
dieksekusi:git-root
:Jika Anda hanya ingin fungsionalitas sebagai bagian dari skrip, hapus shebang, dan ganti
git_root_recurse_parent
baris terakhir dengan:sumber
if
Pernyataan kedua seharusnya memeriksa apakah Anda telah mengubah direktori dalam rekursi. Jika tetap di direktori yang sama, itu mengasumsikan Anda terjebak di suatu tempat (misalnya/
), dan rekursi rem. Bug diperbaiki, dan sekarang seharusnya berfungsi seperti yang diharapkan. Terima kasih telah menunjukkannya.Harus menyelesaikan ini sendiri hari ini. Memecahkannya dalam C # karena saya membutuhkannya untuk sebuah program, tapi saya kira itu bisa ditulis ulang. Pertimbangkan Domain Publik ini.
sumber