Neden "önemli: Bu işlem bir çalışma ağacında çalıştırılmalıdır?" Mesajını alıyorum.


89

Windows'a git yükledim. GIT_DIR değişkenini c: \ git \ olarak ayarladım ve bu ortam değişkeninin cygwin tarafından korunduğunu doğruladım (yani echo $ GIT_DIR olması gerektiği gibi). Git deposunu oluşturmak istediğim klasöre gittim, c: \ www diyelim ve sonra şunu çalıştırdım:

git init
git add .

Sonra şu hatayı alıyorum:

fatal: This operation must be run in a work tree

Neyin yanlış gittiğinden emin değilim, ancak c: \ git dizininde şunu yazan bir yapılandırma dosyası var:

[core]
    repositoryformatversion = 0
    filemode = false
    bare = true
    symlinks = false
    ignorecase = true

Bunun çıplak olmaması gerektiğinden oldukça eminim ve bu bizim sorunumuz.


1
GIT_DIR, CVSROOT'dan tamamen farklı bir kavramdır!
innaM

Yanıtlar:


55

Hatanın doğrudan nedeni, evet, git-addçıplak bir havuzla kullanmanın imkansız olmasıdır . Çıplak bir deponun tanımı gereği çalışma ağacı yoktur. git-addçalışma ağacından dosyaları alır ve bunları kaydetmeye hazırlanmak için dizine ekler.

Yine de, burada kurulumunuza biraz düşünmeniz gerekebilir. GIT_DIR, tüm git komutları için kullanılan depo dizinidir. İzlediğiniz her şey, belki de tüm sisteminizdeki şeyler için gerçekten tek bir depo oluşturmaya mı çalışıyorsunuz? Doğası gereği bir git deposu, tek bir dizinin içeriğini izler. İzlemek GIT_WORK_TREEistediğiniz her şeyi içeren bir yol belirlemeniz gerekecek ve ardından .gitignore, izlemeyle ilgilenmediğiniz her şeyi bloke etmeniz gerekecek .

Belki sadece izleyecek bir depo oluşturmaya çalışıyorsunuz c:\www? O zaman onu yerleştirmelisiniz c:\www(GIT_DIR ayarlamayın). Bu, "modülünüzün" en üst düzey dizininin .git dizinindeki deposu ile git'in normal kullanımıdır.

Gerçekten iyi bir sebebin yoksa git'in çalışma tarzına bağlı kalmanı tavsiye ederim. İzlenecek birkaç şeyiniz varsa, muhtemelen birkaç depo istersiniz!


10
1. Sadece '20 komutta günlük GIT' ve git-init (1) manpPage by Linus T.'yi takip ediyoruz (maalesef tarihi geçmiş olabilir?) bu konuda ne yapılacağına dair ipucu

55
Sadece git config --unset core.bare.
Matthias Urlichs

Sorunum blj'nin cevabıyla çözüldü, ancak bu alt klasörün içinde, git branchdalları listeleyebildim komutunu kullanarak ancak yapamadım git checkout -b feature22. Bu , dalları listelemek için bir çalışma ağacına ihtiyaç duymadığı, ancak kontrol etmek için gerekli olduğu anlamına mı geliyor?
Honey

206

Ayrıca, muhtemelen .git alt klasörünün içindesiniz, bir klasör yukarı proje kök dizininize taşıyın.


7
Gördüğüm en iyi cevap! Kabul edilen cevap olmalı.
GeertVc

Bu en iyi cevaptır. Gördüğüm. küçük sorun. küçük çözüm. Sevdim.
Ariful Islam

2
Bu mesajı bastırmanın bir yolu var mı?
roachsinai

19

Sadece ben başkasına oluyor ne durumda, bunu söylemek gerekmez:
Ben idi .gitben bu hatayı başlamıştı benim proje içinde dizine.
Cevapları aradım ve araştırdım ama hiçbir şey işe yaramadı.
Tek yapmam gereken doğru dizine geri dönmekti ( cd .. ).
Benim için bir tür yüz-avuç içi anıydı.
Benim kadar aptal birinin olması durumunda, umarım bu cevabı faydalı bulmuşsunuzdur.


1
Benzer bir deneyim. Benim durumumda GitExtensions (windows için) kullanıyordum ve depoyu açmaya çalışırken, içeren klasör yerine .git dosyasını açmak için tıkladım. İlk başta iyi görünüyordu ama aslında bir şey yapmaya başladığımda bana ağaç hatasını verdi.
2017

1
Bunun bir düzine olumlu oyu olmasını seviyorum. Açıkça görünmesine rağmen bu cevabı göndermiş olduğuma sevindim.
Jacob Zimmerman


12

Sadece klonlamak başka bir klasörde aynı projeyi ve kopyalama .git / projenize klasörü.

Misal

Geçici klasör oluşturun:

mkdir temp

geçiş sıcaklığı klasörüne

cd temp/

aynı projeyi geçici klasörde klonlayın :

git clone [-b branchName] git@path_to_your_git_repository

.git klasörünü projenize kopyalayın:

cp -R .git/ path/to/your/project/

projenize geçin ve çalıştırın git status

silmek geçici senin bittiğinde eğer klasör.

umarım bu birine yardımcı olur


1
Bunu yararlı buldum, ancak ilk satırın neyin yanlış olduğunu anlamamı sağlamak için yeterli olduğunu söylemeliyim. Gerisi aslında biraz kafamı karıştırdı. Yine de çok teşekkürler :)
randombee

@randombee Bu benim için çalıştı. . . ama neden? Bu ne yapar?
Yatharth Agarwal

8

GIT_DIROrtam değişkenini açıkça ayarlamak, git'i belirtilen dizini git deposu olarak kullanmaya zorlar. Normal kullanım sırasında asla gerekli değildir.

Örneğinizde, çünkü bir a belirttiniz GIT_DIRve adlandırılmadı .git(baştaki nokta önemlidir) ve derken çıplak bir depo istediğiniz bir --work-treeseçenek sunmadınız veya GIT_WORK_TREEortam değişkenini ayarlamadınız git init.

Çıplak bir deponun çalışma ağacı olmadığından, geniş bir komut seçimi, çıplak bir havuzla anlam ifade etmez. git addsadece biridir.

Git deponuz için, .gitçalışan ağaç kökü altındaki bir alt klasör yerine standart olmayan bir konum kullanmanızın özel bir nedeni var mı ? Bunu düzenlemek mümkün olsa da, daha fazla çalışma ve kullanıcı hatalarına daha yatkın olma eğilimindedir.


GIT_WORK_TREE'yi ayarlamak benim için çözdü. GIT_DIR kullanmamın nedeni, birkaç dakikada bir ekleyen / tamamlayan bir arka plan görevim olduğu çalışma kopyam için ayrı bir git deposu istememdir. Bu işlem GIT_DIR'ı .gitsave olarak ayarlar. Gerçek repo çalışmam .git cinsinden. Artık yerel bir canlı izleme depom var, bu nedenle tüm dosyaların sürümlerini değiştirdikçe sahibim.
MikeJansen

6

Çıplak bir GIT deposu oluşturun

Küçük bir rant: git kendi başına normal bir çıplak depo oluşturamaz. Gerçekten aptal herif.

Kesin olarak, boş depoları klonlamak mümkün değildir. Yani boş bir depo, işe yaramaz bir depodur. Aslında, normalde boş bir depo oluşturursunuz ve hemen doldurursunuz:

git init
git add .

Ancak, git add, çıplak bir depo oluşturduğunuzda mümkün değildir:

git --bare init
git add .

"ölümcül: Bu işlem bir çalışma ağacında çalıştırılmalıdır" hatası verir.

Sen de kontrol edemezsin:

Initialized empty Git repository in /home/user/myrepos/.git/
fatal: http://repository.example.org/projects/myrepos.git/info/refs not found: did you run git update-server-info on the server?

git --bare init
git update-server-info # this creates the info/refs file
chown -R <user>:<group> . # make sure others can update the repository

Çözüm, başka bir yerde başka bir depo oluşturmak, o depoya bir dosya eklemek ve onu çıplak depoya itmektir.

mkdir temp; cd temp
git init
touch .gitignore
git add .gitignore
git commit -m "Initial commit"
git push (url or path of bare repository) master
cd ..; rm -rf temp

umarım bu sana yardımcı olabilir


1
Bu kesinlikle doğru değil. Çıplak bir depo oluşturabilir ve onu içine klonlayabilirsiniz. Doğru olsa bile soruyu yanıtlamaz. (Örn$ git --bare init bare.git Initialized empty Git repository in /home18/cbailey/gittest8/bare.git/ $ git clone bare.git non-bare Cloning into 'non-bare'... \\ done. \\ warning: You appear to have cloned an empty repository.
CB Bailey

Özür dilerim, "url'yi veya çıplak deponun yolunu" paketlemek için "<>" kullanırsam, bu gözden geçirilebilir olacaktır. ve olumlu dediğim şey gerçekten işe yarıyor, kendimi test edip doğruladım.
user1329261

6

Bu sorunu yaşadım çünkü .git/configiçerdi worktree = D:/git-repositories/OldName. Ben onu şimdi değiştirdimworktree = D:/git-repositories/NewName

Bunu keşfettim, çünkü daha ayrıntılı bir hata mesajı gösteren git gui'yi kullandım :

git gui hatası


1
Git bash kullandım ve mesaj aldım fatal: this operation must be run in a work tree. Yapılandırma dosyasını değiştirmek benim için sorunu çözdü.
pawellipowczan

4

Benim durumumda, depom için ".git" dosyasıyla aynı klasördeydim. Bir dizin yukarı gitmem gerekti, çözdü.


2

Başka hiçbir şey işe yaramıyorsa, yolu iki kez kontrol edin git config core.worktree. Bu yol, çalışma dizininizi göstermiyorsa, onu güncellemeniz gerekebilir.

Bu hatayı alma şeklim, bir ağ sürücüsünde bir Git deposu oluşturmamdı. Bir bilgisayarda iyi çalıştı, ancak bu hatayı başka bir bilgisayarda döndürdü. Sürücüyü, onu oluşturduğum bilgisayardaki bir Windows sürücü harfiyle eşleştirmiştim, ancak diğer bilgisayarda değil ve Git, çalışma ağacına giden yolu UNC yolu değil, eşlenen yol olarak kaydetti.


1

Mevcut (çıplak olmayan) bir kontrol bu hatayı vermeye başlarsa, .git / config dosyanızı kontrol edin; eğer core.baredoğruysa, o yapılandırma satırını kaldırın


0

Yukarıdaki olağan yollardan hiçbiri size yardımcı olmazsa, bu hata mesajının ( "fatal: This operation . . .") altındaki çağrı izine bakın ve gerçek hatayı artıran komut dosyasını ve satırı bulun. Bu error () çağrısını bulduğunuzda, devre dışı bırakın ve denediğiniz işlemin bazı uyarılar / mesajlarla bile tamamlanıp tamamlanmadığını görün - şimdilik onları yok sayın. Eğer öyleyse, nihayet tamamlandıktan sonra, işlemin başarıyla tamamlanmayan kısmından bahsedebilir. Şimdi, bu bölümü uygun şekilde ayrı ayrı ele alın.

Yukarıdaki mantıkla durumumla ilgili olarak "fatal: This operation . . .", Android-x86 kodunu almaya çalışırken bu hata mesajını alıyordum repo sync . . .. ve çağrı izleme raise GitError("cannot initialize work tree"), yukarıdaki hata mesajına ( "fatal: . . .") neden olan error () çağrısı olarak gösterildi . Yani, bu yorum sonra GitError()içinde .repo/repo/project.py, repo sync . . .düzgün senkronize edilmiyordu üç projeleri için nihayet belirtilen hata devam etti ve. *.gitKlasörlerini yerel olarak Android-x86 kaynak ağacındaki ilgili yollarından sildim ve repo sync . . .tekrar koştum ve başarıyı tattım!


0

Aynı sorunla karşılaştım, aşağıdaki adımları uyguladım,

  1. git init
  2. git ekle.
  3. git commit -m "ilk kurulum"
  4. git push -f kaynak ana

sonra çalışmaya başlar.


0

Yapılandırma dosyasını düzenledi ve bare = true değiştirilerek bare = false olarak değiştirildi


0

Ek olarak, görünüşe göre, NTFS Ram Sürücüsüne klonlarsanız bu hata meydana gelecektir.

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.