git --git-dir beklendiği gibi çalışmıyor


209

Git'i olduğumdan farklı bir dizinden çalıştırmaya çalışıyorum. Örneğin:

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

Şimdi bu komutu --git-dirseçeneği kullanarak farklı bir dizinden çalıştırmak istiyorum .

Diyelim ki ben varım root/ve şunu deneyelim:

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

Ayrıca .gitklasörü dahil etmeye çalıştım yani

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

Ancak bu, git'i kökten çalıştırmaya çalışıyor gibi görünüyor, yani alan klasörümdeki her şeyi silip kökteki her şeyi ekliyor.

Umarım birisi neyi yanlış yaptığımı tavsiye edebilir.


4
Şimdi durum mükemmel çalışıyor var ama çekme hata veriyor. yani root @ erx [/] # git --git-dir = / home / domain / .git --work-tree = / home / domain / kökeni öldürme ana ölümcül: / usr / local / libexec / git-core / git -pull çalışan bir ağaç olmadan kullanılamaz. Ama statü çalışıyor ?? herhangi bir fikir Jon
Lee

4
Bu git'teki en büyük hatadır. --Work-tree ve / veya --git-dir parametrelerine uymamak.
Adam Dymitruk

5
Budala 1.8.5 başlayarak, seçeneğine sahip olacak değil ayarlamak --git-dirve --work-treebasit bir komut için: bkz aşağıda Cevabımı
VonC

Yanıtlar:


314

Çalışma talimatını da tanımlamanız gerekir. Kafa karıştırıcı biliyorum ama bu esnek bir şey.

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

Burada biraz daha okuyabilirsiniz


3
Teşekkürler bu çalıştı! Bunun kafa karıştırıcı olduğunu kabul etti. Buna Basit Tut Aptal denir. Neredeyse her zaman esnekliğe izin verirken, aynı zamanda en anlamlı VS'nin bir komutu olmayan çalışmalara hiç izin vermeyen varsayılanlar verir.
Nay

3
@Nick kabul etti, --git-dirbelirtilmemişse, /mycode/.gitvar olup olmadığını kontrol eder ve bir hata atmadan önce bunu kullanır.
GP89

4
@NickYeates ikinci! Ayrıca benim ana dizine başvurmak için ~ kullanırken bir sorun vardı, örneğin git --git-dir=~/src/s3cmd/.git --work-tree=~/src/s3cmd pullişe yaramadı ama git --git-dir=/home/username/src/s3cmd/.git --work-tree=/home/username/src/s3cmd pullyaptı
Jamie Cook

1
Tüm komutların çalışma ağacını gerektirmediğini unutmayın; örneğin, "git --git-dir = / mycode / .git günlüğü" düzgün çalışır. Bu kafa karıştırıcı olsa da kabul etti!
yoyo

4
Küçük açıklama: git --git-dir="$HOME/foo/.git" --work-tree="$HOME/foo" status
Haris Krajina

136

Git 1.8.5'ten başlayarak (önümüzdeki hafta çıkacak), daha da basit olacak:

 git -C "/home/domain/" status

Ayarlamaya gerek yok --git-dirve --work-treeartık!


Bkz 44e1e4 taahhüt tarafından Nazri Ramliy :

Geçerli dizinden ayrılmadan git komutunu farklı bir dizinde çağırmak için daha fazla tuşa basmak gerekir:

  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

Yukarıda gösterilen yöntemler komut dosyası oluşturma için kabul edilebilir, ancak hızlı komut satırı çağrıları için çok kullanışsızdır.

Bu yeni seçenekle yukarıdakiler daha az tuşa basarak yapılabilir:

  1. git -C ~/foo status
  2. git -C ../.. grep foo
  3. for d in d1 d2 d3; do git -C $d svn rebase; done

4
Git komutundan sonra -C bayrağını kullanmaya çalışırken takıldım (örneğin git status -C <path>işe yaramayacak!)
Kedar Paranjape

42

Yukarıdaki yorumunuza dayanarak, hâlâ bir sorunla karşılaştığınız anlaşılıyor:

root @ erx [/] # git --git-dir = / home / domain / .git --work-tree = / home / domain / kaynak kökeni yöneticisi
fatal: / usr / local / libexec / git-core / git-pull çalışan bir ağaç olmadan kullanılamaz

Kulağa bunu crontabya da başka bir şeyle çalıştırmak niyetindeymişsiniz gibi geliyor . Önce cdçalışma dizininize geçmek için daha iyi durumda olabilirsiniz . Örneğin:

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

Bu geçici olarak (parantezlerin yaptığı bir alt kabukta) geçerli dizini değiştirir /home/domainve sonra çalışır git pull origin master. Komut tamamlandıktan sonra, geçerli dizininiz komuttan önceki her durumda kalır.


Subshell kullanmak basit ve zariftir. Bunu neden daha önce düşünmediğimi bilmiyorum!
Ehtesh Choudhury

Üzgünüm @Greg, Jon tarafından sorulan soruya cevap olarak diğer cevabı oyladı - ama sanırım niyeti tespit etmek ve cevaplamakla ilgileniyorsunuz ve anlayışınız yani () s, tam olarak +10
Darren Bishop

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

Git 2.26 (Q1 2020) ile belgeler daha nettir.

GIT_DIR(Ortam değişkeniyle veya " git --git-dir=<where> cmd" seçeneğiyle) nerede olduğunu belirtmenin bir etkisi , depo keşfini devre dışı bırakmaktır .

Bu, yeni kullanıcılar sıklıkla karıştıklarından belgelere biraz daha fazla vurgu yapmıştır.

Bkz . Heba Waly ( ) tarafından d82ad54 (30 Ocak 2020) taahhüdü . (Göre Birleştirilmiş Junio Cı Hamano - - içinde 17e4a1b tamamlama , 12 Şubat 2020)HebaWaly
gitster

git: --git-dir için güncelleme belgeleri

İmzalayan: Heba Waly
Yardım eden: Junio ​​C Hamano

git --git-dir <path> biraz kafa karıştırıcıdır ve bazen kullanıcının beklediği gibi çalışmaz.

Örneğin, kullanıcı çalışırsa git --git-dir=<path> status, git depo bulma algoritmasını atlar ve aksi belirtilmedikçe çalışma ağacını kullanıcının geçerli çalışma dizinine atar.
Bu atama yanlış olduğunda, çıktı kullanıcının beklentilerine uymaz.

Bu yama daha açık hale getirmek için belgeleri günceller.

Şimdilik belgelergit --git-dir şunları içeriyor:

--git-dir=<path>:

Deponun (" .git" dizini) yolunu ayarlayın .
Bu, GIT_DIRortam değişkeni ayarlanarak da kontrol edilebilir .
Geçerli bir çalışma dizinine mutlak bir yol veya göreli yol olabilir.

.gitBu seçeneği (veya GIT_DIRortam değişkenini) kullanarak " " dizininin konumunu belirtmek, " .git" alt dizinine sahip bir dizin bulmaya çalışan depo keşfini kapatır (çalışma ağacının havuzu ve üst düzeyi nasıl keşfedilir), Git'e çalışan ağacın en üst seviyesinde olduğunuzu söyler.

Çalışma ağacının üst düzey dizininde değilseniz, Git'e --work-tree=<path>seçenek (veya GIT_WORK_TREEortam değişkeni) ile çalışma ağacının en üst düzeyinin nerede olduğunu söylemelisiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.