Depoda olmadan bir Git komutunu nasıl çalıştırırım?


131

Git komutlarını o havuzda olmadan bir depoda yürütmenin bir yolu var mı?

: Böyle örnek bir şey için git /home/repo log?

Lütfen bana söyleme cd. Bunu bir execarama yoluyla yapıyorum .


3
Exec çağrınız olarak sadece "cd / home / repo && git log" olamaz mısınız?
Alex Howansky

Bununla ilgili bazı tuhaf sorunlarım var. Gerçek bir uygulama değil, yeni bir sürece başlıyorum, ama yine de nasıl farklı olduklarını bilmiyorum. Git dizinini belirtmek için bir parametre bulmayı daha kolay buluyorum.
Tower



1
git --git-dir = / home / repo / .git log
Atiq Ur Rehman

Yanıtlar:


102

Deneyin:

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

Deponuzun .git dizinine kadar olan yolu vermek önemlidir. Aksi takdirde, yalnızca aşağıdaki gibi bir şey söyleyen bir hata mesajı alırsınız:

fatal: Not a git repository

2
Almaya devam ediyorum fatal: Not a git repository (or any of the parent directories): .git. @Patrick Ben hiçbir şeye oy vermedim?
Tower

3
@Patrick Cevap düzenlendi (ilk başta --work-dirdüşündüğümü söyledi )
Gareth

1
İşlemin tüm dosyalarını silindi olarak gösterdiğinden bu benim için işe yaramadı. Görünüşe göre kaydetmeyi kontrol ediyor, ancak klasör içeriğini kontrol etmiyor. Daha iyi performans için @calandoa'nın yanıtına bakın.
mxcd

2
En son git'i kullanmam işe yaramadı, ancak -C seçeneğini kullanarak işe yaradı, örneğin: git -C /home/repo/.git log
D.Snap

1
bu aslında po'nun beklediği gibi çalışmadı. bu neden kabul edilen bir cevap? Bu, geçerli dizini çalışma ağacı olarak kullanacak ve belirtilen .git'i geçmiş için kullanacaktır ki bu tamamen yanlıştır. Örneğin, yalnızca günlüğü göstermezseniz git status. -Cgitmek için doğru yoldur.
Wang

218

Şu -Cseçeneği kullanın ( dokümanlar ):

git -C /home/repo log

Bu, normal klasöre hemen hemen eşdeğerdir --git-dirve klasör --work-treeeklenmeden.git

Düzenle:

Cevap olumsuz oylandı ... oldukça şaşırtıcı, çünkü kesinlikle bu soruya verilecek tek doğru cevap. Depoya çalışma ağacının dışından erişmek için seçenekler --git-dirve --work-treemevcut değiller, bunları taşımak için kullanılırlar..git başka bir yere için kullanılıyorlar ve bazı durumlarda kullanımı çok daha karmaşık.

Örneğin, /home/repo/subdiryalnızca günlüğünü almak için :

git -C /home/repo/subdir log .

veya

git -C /home/repo log subdir

Veya log .ile kullanmak mümkün değildir . Yol, alt yolu çalışma ağacının tepesine göre ayıklamak için işlenmelidir ve bu durumda bile, seçeneği kullanmazsanız git bunu bir yol olarak tanımayacaktır , bu nedenle olası tek yol şudur:--git-dir--work-tree--

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

Ayrıca, benim sürümümle (git 1.9.1) alt komutla --work-treehiç çalışmıyor log. Sadece görmezden gelinir:

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

Bunun bir hata mı yoksa özellik mi olduğunu bile anlamıyorum ... her zamanki gibi git tasarım seçeneklerinde olduğu gibi.


Ek açıklama eklediğiniz için teşekkür ederiz.
Erick G. Hagstrom

git stashEğer başarısız olan bir alt komutuyla başka bir örneğidir --git-dirve --work-treekullanılır.
d5ve

4
-C seçeneği, 2013'te piyasaya sürülen
git'in

-C benim için --git-dir'den daha iyi çalıştı ... -C, depo için git yapılandırma ayarlarını kabul ediyor. Git sürüm 1.9.5.msysgit.1 çalıştırıyorum
Straff

@calandoa, konumu her zaman kökünden belirtmemiz gerekiyor mu, bir şey daha repo adı birden fazla kelime içeriyorsa bu kodu nasıl
yazacağız

17

Aslında --git-dir ve --work-tree'i birlikte kullanmanız gerekir. İşte bir örnek:

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

1
Bu, tek başına --git-dir yanıtından daha doğrudur. git-scm.com/blog/2010/04/11/environment.html
Erick G. Hagstrom

11

Birçok kez denedim! Sonunda anladım!

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

unutmayın, lütfen .git eklemeyin

-C dir


3

Bu, @ max'ın cevabına benzer. Ne yazık ki, --git-dir ihtiyacım olanı yapmadı. düzenle Geriye dönüp baktığımda, okumamış olduğum başka bir [önceki] yanıt önerildi --work-tree. Çevre veya bayrak kullanmanın daha uygun olup olmadığından emin değilim, bu yüzden birisi kullanım bulması durumunda cevabımı bırakacağım, ancak --work-tree/ kullanımına geçeceğim --git-dir.


Biri diğerinin içinde ancak alt modül olmayan iki depo vardır; dış depo bunu görmezden gelir:

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

İstediğim şey git rev-parse --show-prefix, dış repoya göre çıktıydı. İşte bulduğum şey (bash sözdizimi; okunabilirlik için satırlara bölün):

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

4.9.2 içinden yürütüldüğünde dizeyi üretir gcc/4.9.2.


1

Herhangi bir git komutu için şunları yapabilirsiniz:

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

Örneğin, git statüsü yapmak istiyorsanız:

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

veya reponun bulunduğu şubeyi kontrol etmek isterseniz:

git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/  rev-parse --abbrev-ref HEAD
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.