Bagaimana cara menjalankan perintah Git tanpa berada di repositori?

131

Apakah ada cara untuk menjalankan perintah Git pada repositori tanpa berada di repositori itu?

Misalnya kira-kira seperti ini git /home/repo log:?

Tolong jangan beritahu saya cduntuk itu. Saya melakukan ini melalui exectelepon.

Menara
sumber
3
Tidak bisakah Anda hanya "cd / home / repo && git log" sebagai panggilan eksekutif Anda?
Alex Howansky
Saya punya masalah aneh dengannya. Saya memulai proses baru, sebenarnya bukan seorang eksekutif, tapi saya tidak tahu banyak perbedaannya. Saya merasa lebih mudah untuk hanya mencari parameter untuk menentukan direktori git.
Menara
1
Kemungkinan duplikat git pull saat tidak ada di direktori git
Trevor Boyd Smith
1
git --git-dir = / home / repo / .git log
Atiq Ur Rehman

Jawaban:

102

Mencoba:

git --git-dir=/home/repo/.git log

Penting untuk memberikan jalur hingga direktori .git dari repositori Anda. Jika tidak, Anda hanya akan mendapatkan pesan kesalahan yang mengatakan sesuatu seperti:

fatal: Not a git repository
maks
sumber
2
Saya terus mendapatkan fatal: Not a git repository (or any of the parent directories): .git. @Patrick Saya tidak menjatuhkan suara apa pun?
Menara
3
@Patrick Jawabannya diedit (awalnya mengatakan --work-dirsaya pikir)
Gareth
1
Ini tidak berhasil untuk saya, karena ini menunjukkan semua file dari komit sebagai dihapus. Sepertinya itu memeriksa komit tetapi bukan konten foldernya. Lihat jawaban @calandoa untuk performa yang lebih baik.
mxcd
2
Tidak berhasil untuk saya yang menggunakan git terbaru, namun menggunakan opsi -C berhasil, contoh: git -C /home/repo/.git log
D. Snap
1
ini sebenarnya tidak bekerja seperti yang diharapkan po. mengapa ini adalah jawaban yang diterima? Ini akan menggunakan dir saat ini sebagai pohon kerja dan menggunakan .git yang ditentukan untuk riwayat, yang sepenuhnya salah. Jika Anda tidak hanya menampilkan log, misalnya git status,. -Cadalah cara yang benar untuk pergi.
Wang
218

Gunakan -Copsi ( dokumen ):

git -C /home/repo log

Ini hampir sama dengan --git-dirdan --work-treetanpa menambahkan .gitfolder biasa

Edit:

Jawaban tidak disukai ... cukup luar biasa, karena, sebenarnya, ini adalah satu-satunya jawaban yang benar untuk pertanyaan tersebut. Opsi --git-dirdan --work-treetidak ada untuk mengakses repositori dari luar pohon kerja, mereka digunakan untuk pindah ke .gittempat lain, dan mereka jauh lebih rumit untuk digunakan dalam beberapa kasus.

Misalnya, untuk mendapatkan log /home/repo/subdirhanya:

git -C /home/repo/subdir log .

atau

git -C /home/repo log subdir

Tidak mungkin digunakan log .dengan --git-diratau --work-tree. Path harus diproses untuk mengekstrak subpath yang berhubungan dengan bagian atas work tree, dan bahkan dalam kasus tersebut, git tidak akan mengenalinya sebagai path jika Anda tidak menggunakan --opsi tersebut, jadi satu-satunya cara yang mungkin adalah:

git --git-dir /home/repo/.git log -- subdir

Selain itu, --work-treetidak berfungsi sama sekali dengan logsubperintah dengan versi saya (git 1.9.1). Itu hanya diabaikan:

git --git-dir /home/repo/.git --work-tree /home/repo/subdir log -- subdir
git --git-dir /home/repo/.git --work-tree /home/repo/whatever log -- subdir

Saya bahkan tidak mengerti apakah ini bug atau fitur ... seperti biasa dengan banyak pilihan desain git.

calandoa
sumber
Terima kasih telah menambahkan penjelasan tambahan.
Erick G. Hagstrom
git stashadalah contoh lain dari subperintah yang gagal jika --git-dirdan --work-treedigunakan.
d5ve
4
Opsi -C ditambahkan di versi 1.8.5 dari git, yang dirilis pada 2013.
d5ve
-C bekerja lebih baik daripada --git-dir untuk saya ... -C menghormati pengaturan konfigurasi git untuk repo. Saya menjalankan git versi 1.9.5.msysgit.1
Straff
@calandoa apakah kita selalu perlu menentukan lokasi dari root, satu hal lagi jika nama repo mengandung banyak kata bagaimana kita memasukkan kode ini
Kasun Siyambalapitiya
17

Sebenarnya Anda perlu menggunakan --git-dir dan --work-tree secara bersamaan. Berikut ini contohnya:

local [] Desktop: mkdir git
local [] Desktop: cd git
local [] git: touch README.txt
local [] git: git init
Initialized empty Git repository in /Users/albert/Desktop/git/.git/
local [] git: cd ..
local [] Desktop: git --work-tree=git --git-dir=git/.git add .
local [] Desktop: git --work-tree=git --git-dir=git/.git commit -a -m 'initial commit, called from outside the git directory'
[master (root-commit) ee951b1] initial commit, called from outside the git directory
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.txt
local [] Desktop: cd git
local [] git: git log --pretty=oneline
ee951b161053e0e0948f9e2a36bfbb60f9c87abe initial commit, called from outside the git di
alberto56
sumber
1
Ini lebih benar daripada jawaban dengan --git-dir saja. git-scm.com/blog/2010/04/11/environment.html
Erick G. Hagstrom
11

Saya sudah mencoba berkali-kali! Saya akhirnya mendapatkannya!

git -C dir --no-pager log --format='%an' -1 filename

ingat, jangan menambahkan .git ke

-C dir

penny chan
sumber
3

Ini mirip dengan jawaban @ max. Sayangnya, --git-dir tidak melakukan apa yang saya butuhkan. edit Dalam retrospeksi, jawaban [sebelumnya] lain yang belum saya baca menyarankan penggunaan --work-tree. Saya tidak yakin apakah menggunakan lingkungan atau bendera lebih tepat, jadi saya akan meninggalkan jawaban saya jika seseorang menemukan menggunakannya, tetapi saya akan beralih ke use --work-tree/ --git-dir.


Ada dua repo, satu di dalam yang lain tetapi bukan submodul; repo luar mengabaikannya:

tools (outer repo)
  gcc/4.9.2 (inner repo)

Yang saya inginkan adalah keluaran git rev-parse --show-prefixrelatif terhadap repo luar. Inilah yang saya dapatkan (sintaks bash; terbagi menjadi beberapa baris agar mudah dibaca):

prefix_dir=$(cd ..; git rev-parse --show-toplevel)
prefix_dir=$(GIT_WORK_TREE=${prefix_dir} git rev-parse --show-prefix)

Ketika dijalankan dari dalam 4.9.2 itu menghasilkan string gcc/4.9.2 .

Brian Vandenberg
sumber
1

Untuk perintah git apa pun, Anda dapat melakukan:

git --git-dir=<PATH-TO-REPO>/.git --work-tree=<PATH-TO-REPO> <git-command>

Misalnya, jika Anda ingin melakukan status git:

 git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/  status

atau jika Anda ingin memeriksa cabang tempat repo berada:

git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/  rev-parse --abbrev-ref HEAD
Paula
sumber