git --git-dir tidak berfungsi seperti yang diharapkan

209

Saya mencoba menjalankan git dari direktori berbeda dari saya. Jadi misalnya jika saya ada di:

cd /home/domain/
git status << runs perfect ie
# On branch master
# Your branch is ahead of 'origin/master' by 6 commits.

Jadi sekarang saya ingin menjalankan perintah ini dari direktori yang berbeda menggunakan --git-diropsi.

Jadi katakanlah saya masuk root/dan coba ini:

git --git-dir="/home/domain/" status
## Error 
fatal: Not a git repository: '/home/domain/'

Saya juga mencoba memasukkan .gitfolder yaitu

git --git-dir="/home/domain/.git/" status

Tapi ini sepertinya sedang mencoba menjalankan git dari root, yaitu menghapus semuanya dari folder domain saya dan menambahkan semuanya di root.

Semoga seseorang dapat memberi saran tentang apa yang saya lakukan salah.

Lee
sumber
4
Sekarang saya mendapatkan status berfungsi sempurna tetapi tarikan memberikan kesalahan. yaitu root @ erx [/] # git - git-dir = / home / domain / .git --work-tree = / home / domain / tarik master asal fatal: / usr / local / libexec / git-core / git -pull tidak dapat digunakan tanpa pohon yang berfungsi. Tapi statusnya berfungsi ?? ide Jon
Lee
4
Ini adalah bug terbesar di git sekarang. Tidak menghormati parameter --work-tree dan / atau --git-dir.
Adam Dymitruk
5
Mulai git 1.8.5, Anda akan memiliki pilihan untuk tidak mengatur --git-dirdan --work-treeuntuk perintah sederhana: lihat jawaban saya di bawah ini
VonC

Jawaban:

315

Anda harus mendefinisikan direktori kerja juga. Bingung saya tahu tapi itu hal yang fleksibel.

git --git-dir=/mycode/.git --work-tree=/mycode status

Anda dapat membaca lebih banyak di sini

Jon Gretar
sumber
3
Terima kasih, ini berhasil! Setuju bahwa ini membingungkan. Namanya Keep It Simple Stupid. Anda hampir selalu dapat memberikan fleksibilitas sementara pada saat yang sama memberikan default yang membuat VS paling masuk akal memiliki perintah tidak bekerja sama sekali.
Nay
3
@Nick setuju, Anda akan berpikir jika --git-dirtidak ditentukan, itu akan memeriksa apakah /mycode/.gitada dan menggunakannya sebelum melempar kesalahan.
GP89
4
@NickYeates diperbantukan! Juga saya punya masalah ketika menggunakan ~ untuk merujuk ke direktori home saya, misalnya git --git-dir=~/src/s3cmd/.git --work-tree=~/src/s3cmd pulltidak berfungsi tetapi git --git-dir=/home/username/src/s3cmd/.git --work-tree=/home/username/src/s3cmd pulltidak
Jamie Cook
1
Perhatikan bahwa tidak semua perintah memerlukan work-tree, misalnya, "git --git-dir = / mycode / .git log" berfungsi dengan baik. Menyetujui hal ini membingungkan!
yoyo
4
Klarifikasi kecil: git --git-dir="$HOME/foo/.git" --work-tree="$HOME/foo" status
Haris Krajina
136

Mulai git 1.8.5 (yang seharusnya keluar minggu depan), itu bahkan akan lebih sederhana:

 git -C "/home/domain/" status

Tidak perlu diatur --git-dirdan --work-treelagi!


Lihat commit 44e1e4 oleh Nazri Ramliy :

Dibutuhkan lebih banyak penekanan tombol untuk menjalankan perintah git di direktori yang berbeda tanpa meninggalkan direktori saat ini:

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-dir=~/foo status
    GIT_DIR=~/foo/.git GIT_WORK_TREE=~/foo git status
  2. (cd ../..; git grep foo)
  3. for d in d1 d2 d3; do (cd $d && git svn rebase); done

Metode yang ditunjukkan di atas dapat diterima untuk skrip tetapi terlalu rumit untuk pemanggilan baris perintah cepat.

Dengan opsi baru ini, hal di atas dapat dilakukan dengan sedikit penekanan tombol:

  1. git -C ~/foo status
  2. git -C ../.. grep foo
  3. for d in d1 d2 d3; do git -C $d svn rebase; done
VONC
sumber
4
Saya tersandung mencoba menggunakan flag -C setelah perintah git (mis. Tidak git status -C <path>akan bekerja!)
Kedar Paranjape
42

Berdasarkan komentar Anda di atas, sepertinya Anda masih mengalami masalah:

root @ erx [/] # git - git-dir = / home / domain / .git --work-tree = / home / domain / tarik master asal
fatal: / usr / local / libexec / git-core / git-pull tidak dapat digunakan tanpa pohon yang berfungsi

Sepertinya Anda berniat untuk menjalankan ini dari crontabatau sesuatu. Anda mungkin lebih baik menggunakan cduntuk beralih ke direktori kerja Anda terlebih dahulu. Sebagai contoh:

root @ erx [/] # (cd / home / domain && git pull master asal)

Ini akan sementara (dalam subkulit, yang merupakan tanda kurung) untuk mengubah direktori saat ini /home/domain, dan kemudian jalankan git pull origin master. Setelah perintah selesai, direktori Anda saat ini tetap apa pun itu sebelum perintah.

Greg Hewgill
sumber
Menggunakan subkulit sederhana dan elegan. Saya tidak tahu mengapa saya tidak memikirkan itu sebelumnya!
Ehtesh Choudhury
Maaf @Greg, pilih jawaban lain oleh Jon saat menjawab pertanyaan yang diajukan - tapi saya pikir Anda tepat melihat dan menjawab niat dan wawasan Anda yaitu (), persis seperti yang saya cari +10
Uskup Darren
1
git --git-dir="/home/domain/" status
## Error 
fatal: Not a git repository: '/home/domain/'

Dengan Git 2.26 (Q1 2020), dokumentasi lebih jelas.

Salah satu efek dari menentukan di mana GIT_DIRada (baik dengan variabel lingkungan, atau dengan opsi " git --git-dir=<where> cmd") adalah menonaktifkan penemuan repositori .

Ini telah menempatkan sedikit lebih banyak tekanan dalam dokumentasi, karena pengguna baru sering menjadi bingung.

Lihat komit d82ad54 (30 Jan 2020) oleh Heba Waly ( HebaWaly) .
(Digabung oleh Junio ​​C Hamano - gitster- dalam komit 17e4a1b , 12 Feb 2020)

git: perbarui dokumentasi untuk --git-dir

Ditandatangani oleh: Heba Waly
Dibantu oleh: Junio ​​C Hamano

git --git-dir <path> agak membingungkan dan terkadang tidak berfungsi seperti yang diharapkan pengguna.

Sebagai contoh, jika pengguna menjalankan git --git-dir=<path> status, git akan melewati algoritma penemuan repositori dan akan menetapkan pohon kerja ke direktori kerja pengguna saat ini kecuali dinyatakan sebaliknya.
Ketika tugas ini salah, output tidak akan cocok dengan harapan pengguna.

Patch ini memperbarui dokumentasi untuk membuatnya lebih jelas.

Jadi dokumentasi untukgit --git-dir saat ini meliputi:

--git-dir=<path>:

Setel path ke .gitdirektori repositori (" ").
Ini juga dapat dikontrol dengan mengatur GIT_DIRvariabel lingkungan.
Ini bisa menjadi jalur absolut atau jalur relatif ke direktori kerja saat ini.

Menentukan lokasi ".git direktori " menggunakan opsi ini (atau GIT_DIRvariabel lingkungan) mematikan penemuan repositori yang mencoba menemukan direktori dengan .gitsubdirektori " " (seperti bagaimana repositori dan tingkat teratas pohon kerja ditemukan), dan memberi tahu Git bahwa Anda berada di tingkat teratas dari pohon yang berfungsi.

Jika Anda tidak berada di direktori tingkat atas pohon yang bekerja, Anda harus memberi tahu Git di mana tingkat teratas pohon yang bekerja, dengan --work-tree=<path>opsi (atau GIT_WORK_TREEvariabel lingkungan)

VONC
sumber