Git deposuna nasıl boş bir dizin ekleyebilirim?


4263

Git deposuna boş bir dizini (dosya içermeyen) nasıl ekleyebilirim?


16
Yararlı olmasa da, boş (gerçekten boş) bir dizini repolarınıza hacklemenin bir yolu vardır . checkoutAncak Git'in şu anki sürümlerinde olmayacak .
tiwo

335
@tiwo I için yararlı olmadığını kabul etmiyorum. Dizin hiyerarşiniz projenizin bir parçasıdır, bu nedenle sürüm kontrollü olmalıdır.
JBentley

114
Benim durumumda, tmp dosyaları için bir dizin yapısı eklemek istiyorum, ancak tmp dosyalarının kendilerini değil. Bunu yaparak, test cihazım doğru yapıya sahiptir (aksi takdirde hatalar vardır) ama taahhütlerimi tmp verileriyle tıkamıyorum. Yani evet, bu benim için yararlı!
Adam Marshall

45
@AdamMarshall Bence tiwo hack yararlı olmadığını söyledi, çünkü ödeme tarafından göz ardı edilir. Tmp dirs bir VCS için yararlı bir özellik gibi geliyor.
Quantum7

31
Neden tmp dosyalarını oluşturan prosedür de tmp dizinini oluşturmuyor?
RyPeck

Yanıtlar:


4125

Bir dizini (neredeyse) boş (depoda) yapmanın başka bir yolu, .gitignorebu dizinde bu dört satırı içeren bir dosya oluşturmaktır :

# Ignore everything in this directory
*
# Except this file
!.gitignore

O zaman siparişi m104'ün çözümünde yapmanız gereken şekilde almanız gerekmez .

Bu, bir git durumu yaptığınızda bu dizindeki dosyaların "izlenmemiş" olarak görünmemesini de sağlar.

Yapımı @GreenAsJade bireyin comment kalıcı:

Bence bu çözümün soruyu tam olarak istediğini yaptığını belirtmek gerekir, ancak belki de bu soruya bakan birçok insanın aradığı şey değildir. Bu çözüm dizinin boş kalmasını garanti eder. "Buraya asla dosya teslim edilmesini gerçekten istemiyorum" yazıyor. "Henüz kontrol etmek için herhangi bir dosyam yok ama dizine ihtiyacım var, dosyalar daha sonra geliyor olabilir".


25
@JohnMee tarafından önerilen README çözümünün bu çözümle birlikte kullanılması gerektiğini düşünüyorum; .gitignore dosyası sürüm denetiminin dışında tutmak istediklerimizin bir açıklamasını sağlarken, README dosyası her ikisinin de çok önemli bilgi parçaları olan dizinin amacının ne olduğunu açıklar.
pedromanoel

18
@pedromanoel Dosyanın READMEiçine koyacağınız belgeleri yazıyorum .gitignore(yorumlar olarak).
Carlos Campderrós

69
1 farkını tespit edin: 1.) boş bir klasör, 2.) .gitignore dosyası bulunan bir klasör. ;-)
Peter Perháč

6
Bu önbellek klasörleri için mükemmeldir .
redolent

10
Ne yazık ki, bu boş olmayan bir dizin ile sonuçlanır, tek bir gizli dosyaya sahiptir.
pedorro

1090

Yapamazsın. Git SSS bölümüne bakın .

Şu anda git dizininin tasarımı (hazırlama alanı) sadece dosyaların listelenmesine izin vermektedir ve boş dizinlere izin verecek değişikliği yapmaya yetecek hiç kimse bu durumu düzeltmek için yeterince önemsememiştir.

İçine dosya eklenirken dizinler otomatik olarak eklenir. Yani, dizinlerin asla depoya eklenmesi gerekmez ve kendi başlarına izlenmezler.

" git add <dir>" Diyebilirsiniz , içine dosya eklenir.

Ödemelerde gerçekten bir dizine ihtiyacınız varsa içinde bir dosya oluşturmanız gerekir. .gitignore bu amaç için iyi çalışır; boş bırakabilir veya dizinde görünmesini beklediğiniz dosyaların adlarını girebilirsiniz.


67
Aşağıdaki cevap ÇOK daha iyidir. Git düşük seviyeli yazılımın bana izin vermemesi, boş bir dizine ihtiyacım olduğunda Git'i nasıl kullanacağım kadar önemli değil. 2 satır eklemek .gitignore benim için kabul edilebilir görünüyor.
Amala

1
Biri dosyaları yeni bir dizine taşımak istiyorsa git mv, git yeni dizinin sürüm kontrolü altında olmadığından şikayet edeceği için bunu
yapamazlar

16
Sen "okuyabilir , yapamazsınız, vb imkansız tüm bu sık soru için internet üzerinden". .gitignoreHile sık cevaptır ve tatmin birçok ihtiyaçlarını. Ancak git
track'i

2
Daha Ben bunu düşünürken de, daha o varsa, aslında, "boş dize SHA karma" gibi hissediyor olurdu o nesne olup olmadığını söylemek imkansız olurdu sürece, boş bir ağaç için iyi tanımlanmış bir tanımlayıcı bir ağaç veya bir damla.
Emil Lundberg

21
.gitkeepBu amaç için boş bir dosya kullanan birçok depo gördüm .
Sukima

759

Dizinde boş bir dosya oluşturun .gitkeepve ekleyin.


58
Bunun yerine oluşturmayı teşvik eden bir cevap ekledim .keep.
Acumenus

205
.gitkeepGit tarafından reçete edilmemiştir ve insanları anlamını ikinci olarak tahmin edecek ve bu da onları burada Google aramalarına yönlendirecek. .gitÖnek kongre Git kendisi kullandığı dosya ve dizinleri için ayrılmalıdır.
t-mart

10
@ t-mart " .gitÖnek sözleşmesi ayrılmalıdır ..." Neden? Git bu rezervasyonu talep ediyor mu?
Sınırlı Kefaret

9
Bu durumda bir READMEveya ABOUTdosya aynı derecede iyi veya daha iyi olur. Tıpkı hepimizin URL'lerden önce yaptığı gibi, bir sonraki adam için bir not bırakmak.
Dave

5
Boş bir dizinde kodu test etmesi gereken bir birim testi yazıyorsanız çalışmaz ...
thebjorn

436

Her zaman README dosyasını dizinde, depoda neden boş, aksi halde bu dizinin olmasını istediğinizin açıklandığı bir yere koyabilirsiniz.


39
+1, İyi öneri, boş bir dizin gelecekte kullanılmayacaksa hiçbir anlam ifade etmiyor. Bu yüzden içinde bir README dosyası oluşturun ve bu dizinin ne için olduğunu ve gelecekte hangi dosyaların buraya yerleştirileceğini yazın. Bu her iki sorunu da çözer.
saeedgnu

63
@ilius Saçmalık. Boş dizinler içeren bir dizin yapısı birçok durumda çok arzu edilebilir (bir model dizini istediğiniz ancak henüz bir model oluşturmak için uğraşmadığınız bir MVC uygulaması veya daha sonra paylaşılan görünümler eklemeyi planladığınız bir paylaşılan görünümler dizini gibi) ). Dahası, bunların her birine bir README koymak aşırı kiloludur, çünkü ne için oldukları açıktır ve her birine bir README koymayı unutmak kolaydır. VE bunlara başka dosyalar eklediğinizde README'yi kaldırmayı unutmayın. Temel olarak git kesinlikle boş dizinlere izin vermelidir.
Jez

20
@Jez: Kabul etmiyorum. Önemli olan git, kaynak kodunu kontrol etmek (ve indekslemek) için tasarlanmış olmasıdır. Önemli olarak, bir taahhüdün kimliği içeriğin bir karmasıdır. Yani içeriği olmalı. Ağacın her bölümünde bir README'ye ihtiyacınız yoktur , sadece yaprak düğümleri. Kod koymak istediğiniz yerler varsa, ancak kod yoksa ve "modeller için yer" yankılamaya zaman ayırmazsanız >> README, sahip olduğunuz şey bir taahhüt değil bir fikirdir. Git ile ilgilenmiyorum. "Çalışan uygulamanın XYZ boş dizinleri olmasını istiyorum" demek bir kaynak sorunu değil , bir çalışma zamanı sorunudur. Montajcınızla birlikte kullanın.
Joe Atzberger

6
@JoeAtzberger Bu eksik bir özellik, kasıtlı bir sınırlama değil. Git SSS'den: Şu anda Git endeksinin (hazırlama alanı) tasarımı sadece dosyaların listelenmesine izin veriyor ve boş dizinlere izin verecek değişikliği yapmaya yetecek hiç kimse bu durumu düzeltmek için yeterince önemsemedi.
jbo5112

7
@ jbo5112 Evet, bahsettiğiniz "özel kod", bahsettiğim "yükleyici". Webapp kurulumunuz zaten bir veritabanı, yerel yapılandırma, bağımlılıklar veya 100 başka işlem çekme işlemek zorunda, ancak birkaç boş dizin bunun ötesinde mi? Gradle, yolcu, şef, ilkel bir Makefile, vb. Deneyin. Dizin oluşturma ile bir uygulama yükleme (potansiyel olarak çok daha karmaşık / tehlikeli) çalışmaları arasında güvenlik farkı yoktur. Gerçekten de hiç deps, config, DB vb. Ve yükleyiciniz yoksa, README'yi kullanın. Hiçbir durum her ikisini de yapmanızı gerektirmez.
Joe Atzberger

348
touch .keep

Linux'ta bu, adlı boş bir dosya oluşturur .keep. Değeri ne .gitkeepolursa olsun, bu isim Git'e karşı agnostikken, Git'e özgü olacaktır. İkinci olarak, başka bir kullanıcının belirttiği gibi, .gitönek kuralının Git'in kullandığı dosyalar ve dizinler için ayrılması gerekir.

Alternatif olarak, başka bir cevapta belirtildiği gibi , dizin bunun yerine açıklayıcı READMEveya README.mddosya içerebilir .

Tabii ki bu dosyanın varlığının uygulamanızın bozulmasına neden olmamasını gerektirir.


1
Bu ilk çıplak dizin için iyidir, ancak dosyalar ile dolmaya başlarsa ne olur? Sonra Git onları fark eder ve izlenmemiş dosyalar olarak talep eder. Burada seçilen cevap, bir kişinin bir dizini tutmasına izin vermek, ancak içeriği güvenle görmezden gelmek için çok daha zarif çalışır.
JakeGould

14
Soru ve baskın genel endişe, boş bir dizin eklemekle ilgilidir. Daha sonra yerleşik bir dosya varsa, dosyayı açıkça silin .keepveya sadece dikkate almayın. Bunun yerine dizindeki dosyalar göz ardı edilecekse, bu tamamen farklı bir sorudur.
Acumenus

3
Bunu git clean -nd | sed s/'^Would remove '// | xargs -I{} touch "{}.keep"izlenmeyen tüm boş dizinlerde gerçekleştireceği önerildi .
Acumenus

1
Bu çözümü sevmiyorum, bu dosyanın ne yaptığını tahmin etmek zor. Ayrıca, geliştirme ortamınızda (günlükler veya resimler vb.) Dosyalar oluşturuyorsanız, bu, bu dosyanın sürümlendirilmesini ve üretime girmesini engellemez, bu da hoş değildir.
danielrvt

1
Windows adları olmayan dosyaları sevmez ve bunu başarmak için özel bir büyü gerektirir (diğer bir deyişle bash benzeri bir terminal uygulaması veya eşdeğeri).
EntangledLoops

303

Neden boş sürüm klasörlere ihtiyacımız var?

Her şey sırayla:

Boş bir dizin Git sürüm sistemi altındaki bir ağacın parçası olamaz .

Sadece izlenmeyecek. Ancak, boş dizinlerin "versiyonlanması" nın anlamlı olabileceği senaryolar vardır, örneğin:

  • Bir iskele önceden tanımlanmış klasör yapısını depo her kullanıcı / katılımcı için kullanılabilir hale; veya özel bir durum olarak, klasörü veya içeriğini sağlamak istediğimiz a veya dizinler gibi geçici dosyalar için bir klasör oluşturmakcache/logs/.gitignore
  • Yukarıdakilerle ilgili olarak, bazı projeler bazı klasörler olmadan çalışmaz (bu genellikle kötü tasarlanmış bir projenin bir ipucudur, ancak bu sık sık gerçek dünya senaryosudur ve belki de, örneğin, izin sorunları ele alınabilir).

Önerilen bazı geçici çözümler

Birçok kullanıcı şunları önerir:

  1. READMEDizini boş bırakmak için bir dosya veya başka bir içeriğe sahip başka bir dosya yerleştirme veya
  2. .gitignoreSonunda aynı yaklaşıma # 1 hizmet eden bir tür "ters mantık" içeren bir dosya oluşturmak (yani tüm dosyaları dahil etmek).

Her iki çözüm de kesinlikle işe yararken, Git sürümüne anlamlı bir yaklaşımla tutarsız buluyorum.

  • Neden projenizde gerçekten istemediğiniz sahte dosyaları veya README'leri koymanız gerekiyor?
  • Neden mümkün olsa da ( dosyalar hariç ) ne anlama geldiğinin tam tersi .gitignorebir şey ( dosyaları tutmak ) yapmak için kullanıyorsunuz ?

.gitkeep yaklaşımı

Sürüm sistemindeki klasörün varlığını zorlamak için adlı boş bir dosya kullanın .gitkeep.

Bu kadar büyük bir fark olmasa da:

  • Klasörü tutmak için tek amacı olan bir dosya kullanırsınız . Oraya koymak istemediğiniz bilgileri koymuyorsunuz.

    Örneğin, README'leri, klasörü saklamak için bir bahane olarak değil, yararlı bilgiler içeren README'leri de kullanmalısınız.

    Endişelerin ayrılması her zaman iyi bir şeydir ve yine de .gitignoreistenmeyen dosyaları yok saymak için bir ekleyebilirsiniz .

  • Adlandırma .gitkeep, dosya adının kendisinden (ve aynı zamanda paylaşılan bir proje ve bir Git deposunun temel amaçlarından biri için iyi olan diğer geliştiricilere ) bu dosyanın

    • Kodla ilgisi olmayan bir dosya (baştaki nokta ve ad nedeniyle)
    • Git ile açıkça ilişkili bir dosya
    • Bunun amacı ( tutmak ) açıkça belirtilmeli ve tutarlı ve anlamsal olarak kendi anlam karşıdır görmezden

Benimseme

.gitkeepYaklaşımı Laravel , Angular-CLI gibi çok önemli çerçevelerin benimsediğini gördüm .


8
Bir düşünceyi kaçırdınız - klasörü saklama ve boş bırakma nedeni nedir (örn. / Logs, / tmp, / uploads)? Evet - klasörü boş tutmak için. :) Bir klasörü boş tutmak istiyorsanız, içindeki dosyaları yok saymanız gerekir.
Roman

14
@RomanAllenstein: şart değil. Daha sonra doldurulabilecek belirli bir yapıya sahip bir repo oluşturmuş olabilirsiniz. Bu dosyalar oluşturulduktan sonra repoya eklenir ve .gitignore dosyalarını silmeye veya düzenlemeye başlamak sinir bozucu olacaktır (ve tehlikeli, çünkü muhtemelen izlenmediklerinin farkında bile değilsiniz: git onları görmezden geliyor) )
blueFast

45
@Behnam: Downvote'u alacağım, ancak SO meta üzerine yaptığım araştırma, her okuyucu (ve her beceri seviyesi) için yeterli ayrıntı ve netlik sağladıkları sürece ayrıntılı cevaplara ilişkin hiçbir endişe göstermiyor. Yine de herhangi bir eleştiriye çok açığım ve sebebini kamuya açıkladığınız için teşekkür ederim, çok olumlu alıyorum.
Cranio

4
Değiştirmeye cevabınızı düzenlerseniz .gitkeepbenim upvote olsun herhangi bir başka olmayan git-önceden sabitlenmiş dosya adıyla, ben bu iyi ve en bilgilendirici cevap olduğunu düşünüyorum. Sebep: Bence ".git *" git tarafından belirtilen dosyalar için ayrılmalıdır, bu sadece bir yer tutucudur. Bunu ilk gördüğümde, örneğin bir ".gitkeep" dosyası otomatik olarak yok sayılır (bu güzel bir özellik olurdu) ama durum böyle değil, değil mi?
Johnny

5
İnsanların neden git için "boş" klasörler eklemek istediğini anlamak için neden bu kadar zor zamanlar olduğunu merak ediyorum. Bir yerden başlamak zorundasın, değil mi? Yani, genellikle projelerinizin klasör yapısıyla başlarsınız ve - ne yazık ki - projenin başında henüz hiçbir şey yoktur. Proje deponuz tamamlandıktan sonra, ekip çalışanları AYNI yapıyı klonlayıp çalışmaya başlayabilir.
BitTickler

127

Diğer yanıtlarda açıklandığı gibi Git, hazırlama alanındaki boş dizinleri temsil edemez. ( Git ile ilgili SSS'ye bakın .) Bununla birlikte, amaçlarınız doğrultusunda, bir dizin .gitignoreyalnızca dosya içeriyorsa yeterince boşsa , yalnızca aşağıdaki .gitignoredizinlerde boş dizinlerde dosya oluşturabilirsiniz :

find . -type d -empty -exec touch {}/.gitignore \;

21
.Git dizinini göz ardı etmek isteyebilirsiniz: find . -name .git -prune -o -type d -empty -exec touch {}/.gitignore \;
steffen

3
Çoğu durum için daha basit bir varyasyonfind * -type d -empty -exec touch {}/.gitignore \;
akhan

2
OS X hemen hemen her dizinde bir .DS_Store dosyası oluşturduğundan, burada çalışmaz. Bulduğum tek (TEHLİKELİ!) Geçici çözüm, önce tüm .DS_Store dosyalarını silmek find . -name .DS_Store -exec rm {} \;ve ardından bu yanıttan tercih edilen varyantı kullanmaktı. Bunu yalnızca doğru klasörde yürüttüğünüzden emin olun!
zerweck

1
Windows'ta bunu komut satırından yapmanın bir yolu var mı? Burada Ruby ve Python'da bazı çözümler gördüm, ancak yönetilebiliyorsa barebone çözümü istiyorum.
Mig82

1
@akhan Komutun bayrağı .gitignoreüzerinde bir şey eklemenin hiçbir etkisi yoktur . Benim yorumum, bir dizin ağacındaki dosyaları kaldırmakla ilgilidir , böylece bayrak uygulanabilir. -emptyfind.DS_Store-empty
zerweck

68

Andy Lester haklı, ancak dizininizin boş olması ve boş olmaması gerekiyorsa, .gitignoregeçici bir dosya olarak boş bir dosya koyabilirsiniz .

Bir yana, bu temel bir Git depolama tasarım sorunu değil, bir uygulama sorunudur. Git posta listesinde birçok kez belirtildiği gibi, bunun uygulanmamasının sebebi, hiç kimsenin yapamayacağı ya da yapılmaması gerektiği için bir yama göndermeye yetmeyeceğidir.


4
Ben de öyle dedim. Her iki paragraf da, gönderdiğim SSS snippet'inde ele alınır.
Andy Lester

1
Bence bir kenara test etmek yararlı ve yararlı değil - düzeltilebilir, sadece çoğu durumda böyle kolay bir çözüm olduğunda yakın zamanda beklemeyin.
wnoise

Üzgünüm, son paragrafı okumadım ve ilk paragrafı okurken, neden bu bilgileri tekrarladığımı bilmiyorum.
Aristoteles Pagaltzis

2
Tabii ki, bu ekstra cevap gerçeği belirtmeye hizmet ediyor.
Michael Johnson

Burada dizin yoksa ve varsayılan olarak boş, ancak boş olması gerekmez, yapı düştü bir durum bakarak var. Bir .gitignore oluşturmak doğru olanı yapar.
Joshua

33

Ruby on oluşturma yolunda klasör log:

mkdir log && touch log/.gitkeep && git add log/.gitkeep

Şimdi günlük dizini ağaca dahil edilecektir. Dağıtım yaparken çok kullanışlıdır, bu yüzden günlük dizinleri oluşturmak için bir rutin yazmak zorunda kalmazsınız.

Günlük dosyaları düzenleyerek saklanabilir,

echo log/dev.log >> .gitignore

ama muhtemelen biliyordun.


23
Bunun Ruby on Rails ile ne ilgisi var?
Quolonel Soruları


30

Git boş dizinleri izlemez. Daha fazla açıklama için Git SSS bölümüne bakın . Önerilen geçici çözüm, .gitignoreboş dizine bir dosya koymaktır . Bu çözümü sevmiyorum, çünkü .gitignoreUnix sözleşmesi tarafından "gizli". Ayrıca dizinlerin neden boş olduğuna dair bir açıklama yoktur.

Boş dizine dizinin neden boş olduğunu ve Git'te neden izlenmesi gerektiğini açıklayan bir README dosyası koymanızı öneririm. README dosyası yerinde olduğunda, Git söz konusu olduğunda, dizin artık boş değildir.

Asıl soru neden git'teki boş dizine ihtiyacınız var? Genellikle, derlemeden / çalıştırmadan önce boş dizini oluşturabilen bir çeşit derleme betiğiniz vardır. Değilse, bir tane yapın. Bu, boş dizinleri git'e koymaktan çok daha iyi bir çözümdür.

Yani git'te boş bir dizine ihtiyaç duymanızın bir nedeni var. Bu nedeni README dosyasına koyun. Bu şekilde diğer geliştiriciler (ve gelecekteki) boş dizinin neden orada olması gerektiğini bilirler. Ayrıca boş dizini gerektiren sorun çözüldüğünde boş dizini kaldırabileceğinizi de bileceksiniz.


Her boş dizini listelemek için aşağıdaki komutu kullanın:

find -name .git -prune -o -type d -empty -print

Her boş dizinde yer tutucu README oluşturmak için:

find -name .git -prune -o -type d -empty -exec sh -c \
  "echo this directory needs to be empty because reasons > {}/README.emptydir" \;

README dosyası dışındaki dizindeki her şeyi yoksaymak için aşağıdaki satırları ekleyin .gitignore:

path/to/emptydir/*
!path/to/emptydir/README.emptydir
path/to/otheremptydir/*
!path/to/otheremptydir/README.emptydir

Alternatif olarak, her README dosyasının yok sayılmasını engelleyebilirsiniz:

path/to/emptydir/*
path/to/otheremptydir/*
!README.emptydir

Her README'yi oluşturulduktan sonra listelemek için:

find -name README.emptydir

28

UYARI: Bu ince ayar gerçekten ortaya çıktığı için çalışmıyor. Rahatsızlıktan dolayı özür dileriz.

Aşağıdaki orijinal gönderi:

Git dahili ile oynarken bir çözüm buldum!

  1. Deponuzda olduğunuzu varsayalım.
  2. Boş dizininizi oluşturun:

    $ mkdir path/to/empty-folder
    
  3. Sıhhi tesisat komutunu ve boş SHA-1 ağacını kullanarak dizine ekleyin :

    $ git update-index --index-info
    040000 tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904    path/to/empty-folder
    

    Komutu yazın ve ardından ikinci satırı girin. Girişinizi sonlandırmak için Enterve ardından Ctrl+ tuşlarına basın D. Not: biçim moddur [SPACE] tipi [SPACE] SHA-1hash [SEKME] yoludur (sekme önemlidir, cevap biçimlendirmesi bunu korumaz).

  4. Bu kadar! Boş klasörünüz dizininizde. Tek yapmanız gereken taahhüt etmek.

Bu çözüm kısa ve görünüşe göre iyi çalışıyor ( EDIT'e bakın! ), Ancak hatırlanması o kadar kolay değil ...

Boş ağaç SHA-1, cdiçine git write-treeboş bir ağaç SHA-1 çıktısı veren yeni bir boş Git havuzu oluşturarak bulunabilir .

DÜZENLE:

Bulduğumdan beri bu çözümü kullanıyorum. Herhangi bir modül tanımlanmadığı sürece, bir alt modül oluşturmakla aynı şekilde çalışıyor gibi görünmektedir. Bu, yayınlama sırasında hatalara yol açar git submodule init|update. Sorun, parçayı git update-indexyeniden yazmasıdır .040000 tree160000 commit

Dahası, bu yolun altına yerleştirilen herhangi bir dosya Git tarafından fark edilmeyecektir, çünkü başka bir depoya ait olduklarını düşünmektedir. Kolayca gözden kaçabilir gibi bu kötü!

Ancak, deponuzda zaten Git alt modüllerini kullanmazsanız (ve kullanmayacaksanız) ve "boş" klasör boş kalırsa veya Git'in varlığını bilmesini ve içeriğini yoksaymasını istiyorsanız, bu ince ayar. Alt modüller ile olağan yoldan gitmek, bu ince ayardan daha fazla adım atıyor.


Boş klasörü dizine koyduktan ve işledikten sonra git svn dcommit, istenen sonuçla bu mümkün müdür ?
Sınırlı Kefaret

2
Bu ince ayarın başka herhangi bir araçla çalışması muhtemel değildir. Uyarı ve düzenlemede belirtildiği gibi, oldukça kısıtlı bir durumda olmadığı sürece bunu kullanmaktan vazgeçiyorum.
ofavre

1
Ve elbette bu yüzden git internals ile uğraşmak kontrendikedir.
Casey

@abhisekp Bu nasıl mümkün olabilir?
PyRulez

1
@PyRulez iyi, yazılım dünyasında hiçbir şey imkansız değil. : D Aslında cevabı takip ettim.
abhisekp

21

Diyelim ki tmp adında boş bir dizine ihtiyacınız var :

$ mkdir tmp
$ touch tmp/.gitignore
$ git add tmp
$ echo '*' > tmp/.gitignore
$ git commit -m 'Empty directory' tmp

Başka bir deyişle, Git'e dosyayı (ve boş dizindeki diğer her şeyi) yok saymasını söyleyebilmeniz için önce .gitignore dosyasını dizine eklemeniz gerekir.


11
İki şey: Dokunmak yerine sadece "echo '*'> tmp / .gitignore" kullanabilirsiniz ve "git commit -m" dosyaları dizine ekledikten sonra yapılan değişiklikleri işlemez.
Christoffer Hammarström

6
Sadece yaparsanız echo bla > file, file: File existsçünkü >zaten oradaysa dosyanın üzerine yazacak veya yoksa yeni bir dosya oluşturacaksınız.
psyrendust

3
/bin/shkültürel varsayım! * Eğer "burada" cshve değişken noclobberayarlanmışsa, gerçekten elde edersiniz file: File exists. Birisi "Bunu anlıyorum" derse, onların aptal olduğunu düşünmeyin ve "Hayır, anlamıyorsunuz" diye cevap verin. * c2.com/cgi/wiki?AmericanCulturalAssumption
clacke

1
@clacke Birisi herkesten farklı bir kabuk kullanmaya karar verirse, sorunlarla karşılaşıyorsa bunu açıkça belirtmelidir. Milliyetten farklı olarak, herkesin özgür kabuk seçimi vardır.
SeldomNeedy

2
@SeldomNeedy Belki de yardım arıyorlar çünkü herkesten farklı bir kabuk kullandıklarını bile bilmiyorlar.
clacke

20

Boş bir dizin eklemek, dizinin var olmasını bekleyen komut dosyalarınız olduğu için (belki de oluşturulan ikili dosyalar için bir hedef olduğu için) en az direnç yolu gibi görünebilir. Başka bir yaklaşım , dizini gerektiği gibi oluşturmak için komut dosyalarınızı değiştirmek olacaktır .

mkdir --parents .generated/bin ## create a folder for storing generated binaries
mv myprogram1 myprogram2 .generated/bin ## populate the directory as needed

Bu örnekte, ".generated" öneki olmadan erişebilmeniz için dizinde (bozuk) sembolik bir bağlantıyı kontrol edebilirsiniz (ancak bu isteğe bağlıdır).

ln -sf .generated/bin bin
git add bin

Kaynak ağacınızı temizlemek istediğinizde şunları yapabilirsiniz:

rm -rf .generated ## this should be in a "clean" script or in a makefile

Neredeyse boş bir klasörde kontrol etmek için önerilen yaklaşımı kullanırsanız, ".gitignore" dosyasını da silmeden içeriği silmenin küçük bir karmaşıklığı vardır.

Kök .gitignore'unuza aşağıdakileri ekleyerek oluşturulan tüm dosyalarınızı yok sayabilirsiniz:

.generated

1
Not: .generatedDizin başlangıçta mevcut olmadığından , önerdiğim sembolik bağlantı temiz bir kasada "bozuk" dur. Yapınızı yaptıktan sonra artık kırılmayacak.
nobar

2
Bazı durumlarda bunun çok iyi bir fikir olduğunu kabul ediyorum, ancak diğerlerinde (örneğin, modeller / ve görünümler / gibi klasörlerle boş bir iskelete sahip olduğunuz bir projeyi dağıtmak gibi) kullanıcının bu dizinlere sahip olmasını istersiniz. manuel olarak dokümanlar okumak zorunda değilsiniz ve repo klonlama sonra bir tür kurulum komut dosyası çalıştırmak için beklemek biraz fazla olabilir. Bu cevabı @ john-mee'nin README cevabı ile birlikte tüm vakaları olmasa bile çoğunu kapsaması gerektiğini düşünüyorum.
moopet

14

Boş dizinlerle de karşılaşıyorum. Yer tutucu dosyalarını kullanmayla ilgili sorun, artık gerekli olmadıkları takdirde onları oluşturmanız ve silmeniz gerektiğidir (çünkü daha sonra alt dizinler veya dosyalar eklenmiştir. Bu kaynak tutucuları yönetmek büyük kaynak ağaçları ile hantal ve hata olabilir yatkın.

Bu nedenle, bu tür yer tutucu dosyaların oluşturulmasını / silinmesini otomatik olarak yönetebilen bir açık kaynak aracı yazmaya karar verdim. .NET platformu için yazılmıştır ve Mono (Linux için .NET) ve Windows altında çalışır.

Şuna bir göz atın: http://code.google.com/p/markemptydirs


14

@ Artur79 ve @mjs'nin cevaplarını beğendim, bu yüzden her ikisinin bir kombinasyonunu kullanıyorum ve projelerimiz için bir standart haline getirdim.

find . -type d -empty -exec touch {}/.gitkeep \;

Ancak, yalnızca bir avuç geliştiricimiz Mac veya Linux üzerinde çalışıyor. Windows üzerinde çok fazla çalışma var ve aynı şeyi gerçekleştirmek için eşdeğer bir tek astar bulamadım. Bazıları Cygwin'i başka nedenlerle kuracak kadar şanslıydı , ancak Cygwin'i sadece bunun için reçete etmek aşırıya kaçmış gibi görünüyordu.

Daha iyi bir çözüm için düzenleyin

Bu nedenle, geliştiricilerimizin çoğunda zaten Ant yüklü olduğu için, düşündüğüm ilk şey, bunu platformdan bağımsız olarak gerçekleştirmek için bir Ant derleme dosyası oluşturmaktı. Bu hala burada bulunabilir

Ancak , daha sonra bunu küçük bir yardımcı program komutu haline getirmenin daha iyi olacağını düşündüm, bu yüzden Python kullanarak yeniden oluşturdum ve burada PyPI'de yayınladım . Sadece çalıştırarak kurabilirsiniz:

pip3 install gitkeep2

.gitkeepDosyaları yinelemeli olarak oluşturmanıza ve kaldırmanıza izin verir ve ayrıca bu dizinlerin neden önemli olduğunu anlamaları için arkadaşlarınıza mesajlar eklemenize izin verir. Bu son bit bonus. .gitkeepDosyaların kendi kendini belgelemesinin iyi olacağını düşündüm .

$ gitkeep --help
Usage: gitkeep [OPTIONS] PATH

  Add a .gitkeep file to a directory in order to push them into a Git repo
  even if they're empty.

  Read more about why this is necessary at: https://git.wiki.kernel.org/inde
  x.php/Git_FAQ#Can_I_add_empty_directories.3F

Options:
  -r, --recursive     Add or remove the .gitkeep files recursively for all
                      sub-directories in the specified path.
  -l, --let-go        Remove the .gitkeep files from the specified path.
  -e, --empty         Create empty .gitkeep files. This will ignore any
                      message provided
  -m, --message TEXT  A message to be included in the .gitkeep file, ideally
                      used to explain why it's important to push the specified
                      directory to source control even if it's empty.
  -v, --verbose       Print out everything.
  --help              Show this message and exit.

Umarım faydalı bulursunuz.


13

Yapamazsınız ve maalesef asla yapamayacaksınız. Bu, Linus Torvald'ın kendisi tarafından verilen bir karardır. Bizim için neyin iyi olduğunu biliyor.

Orada bir kez okudum bir yerde bir rant var.

Ben : Boş dizinler buldum .. , ama belki başka bir tane var.

Geçici çözümlerle yaşamak zorundasınız ... maalesef.


1
Bunu kötü bir argüman örneği olarak yayınladığınızı biliyorum, ancak bağlantıyı takdir ediyorum, çünkü aslında dizinleri izleme konusunda iyi bir argüman. ;-)
clacke

1
Bu cevap tutarsız görünüyor, çünkü atıfta bulunulan ileti dizisindeki bir sonraki gönderide , Linus Torvald dizin izleme eklemeleri gerekeceğini beklediğini söylüyor: markmail.org/message/libip4vpvvxhyqbl . Aslında, "boş dizinleri izlemek için destek ekler" yamaları memnuniyetle karşılayacağını söylüyor "
Patrick M

Patrick, orada "aptal" kelimesini de kullanıyor. Onun ifadelerinin buradaki buradaki insanlara bayıldığından şüpheleniyorum ve bu yüzden Git'in kendisine "aptalca" bir şey uygulamadığını varsayalım.
user2334883

10

Bir .gitignoredosya eklediğinizde , içine herhangi bir miktarda içerik koyacaksanız (Git'in yoksaymasını istediğiniz) *, yok sayılan içeriği yanlışlıkla eklemediğinizden emin olmak için yalnızca yıldız işaretli tek bir satır eklemek isteyebilirsiniz. .


9

Git'in dizinleri izlemesini sağlamanın bir yolu yoktur, bu nedenle tek çözüm Git'in izlemesini istediğiniz dizine bir yer tutucu dosyası eklemektir.

Dosya adlandırılabilir ve istediğiniz her şeyi içerebilir, ancak çoğu kişi adlı boş bir dosya kullanır .gitkeep(ancak bazı kişiler VCS-agnostic'i tercih eder .keep).

Önek, .onu gizli bir dosya olarak işaretler.

Başka bir fikir README, dizinin ne için kullanılacağını açıklayan bir dosya eklemek olacaktır.


8

Belirtildiği gibi, boş dizinler eklemek mümkün değildir, ancak burada tüm dizinlere boş .gitignore dosyaları ekleyen bir astar vardır.

ruby -e 'require "fileutils" ; Dir.glob(["target_directory","target_directory/**"]).each { |f| FileUtils.touch(File.join(f, ".gitignore")) if File.directory?(f) }'

Kolay erişim için bunu bir Rakefile içinde sıkışmış.


6
Kullanmayı tercih ederimfind . -type d -empty -print0 | xargs --null bash -c 'for a; do { echo "*"; echo "!.gitignore"; } >>"$a/.gitignore"; done' --
Tino

8

Jamie Flournoy'un çözümü harika çalışıyor. İşte tutmak için biraz geliştirilmiş bir sürüm .htaccess:

# Ignore everything in this directory
*
# Except this file
!.gitignore
!.htaccess

Bu çözüm ile bir boş klasör, örneğin taahhüt edebiliyoruz /log, /tmpya /cacheve klasör boş kalacak.


2
Dosya değil, boş bir dizin tutmak istiyor.
gvsrepins

2
Ve ben de .htaccess'i koruyacağını söyledim. Örnek: Bir yazılımın web yoluyla erişilememesi gereken günlük dosyaları (oksit eshop gibi) için bir dizini varsa, dizinde bir .htaccess vardır. Yukarıda belirtilen .gitignore'u klasöre koyarsanız, .htaccess teslim edilmeyecek ve klasöre web üzerinden erişilebilecektir.
Roman

Sürüm denetimi altında olan bir .htaccess dosyanız varsa, sürüm denetimi altında içeren dizine zaten sahipsiniz. Böylece, sorun zaten çözülmüştür - .gitignore dosyası ilgisiz hale gelir.
17'de Ponkadoodle

1
@Wallacoloo Haklı olduğunuz soru ile ilgili olarak, yine de dosya yararlı, dosyaları bir .htaccess tarafından korunacağı gibi bir yükleme dizini için kullanacağım. Romalılar açıklamasının aksine, .htaccess dosyası yok sayma kuralı tarafından dışlandığı için işlenecektir. [eski konu, biliyorum]
David

7

Her zaman istenen klasör yapımı kontrol etmek ve proje içinde benim için inşa etmek için bir işlev inşa ediyorum. Boş klasörler Git tarafından proxy tarafından tutulduğundan bu sorunla karşılaşırsınız.

function check_page_custom_folder_structure () {
    if (!is_dir(TEMPLATEPATH."/page-customs"))
        mkdir(TEMPLATEPATH."/page-customs");    
    if (!is_dir(TEMPLATEPATH."/page-customs/css"))
        mkdir(TEMPLATEPATH."/page-customs/css");
    if (!is_dir(TEMPLATEPATH."/page-customs/js"))
        mkdir(TEMPLATEPATH."/page-customs/js");
}

Bu PHP, ama eminim çoğu dil aynı işlevselliği destekler ve klasörleri oluşturma uygulaması tarafından halledilir, çünkü klasörler her zaman orada olacak.


2
Hepimiz aynı sayfadayız, artık bunu yapmıyorum. Zaman kaybı. .gitkeepKongre çok daha iyi bir uygulamadır.
Hafif Fuzz

Bunun nasıl zaman kaybı olabileceğini göremiyorum. TEMPLATEPATH açık bir şekilde dinamik olduğunda .gitkeep çözümünü kullanamazsınız. Dinamik olmayan bir klasör yapısıyla bile, dizinleri kontrol etmek gibi çok iyi bir çözümü kaldırmak yerine bazı şeyler eklemelisiniz, örneğin izinleri kontrol edin ve dosyaları chmod edin. Global bir .gitignore içindeki dizinleri işaretlemek için bir yol eklemek benim için mükemmel olurdu. #Keep / path / to / dir gibi bir şey
Jochen Schultz

7

İşte bir hack, ama işe yaraması komik (Git 2.2.1). @Teka'nın önerdiğine benzer, ancak hatırlaması daha kolay:

  • Herhangi bir depoya alt modül ekleme ( git submodule add path_to_repo)
  • Bu, bir klasör ve bir dosya ekleyecektir .submodules. Bir değişiklik yapın.
  • .submodulesDosyayı silin ve değişikliği yapın.

Artık, taahhüt tamamlandığında oluşturulmuş bir dizininiz var. İlginç bir şey, bu dosyanın ağaç nesnesinin içeriğine bakarsanız şunları elde etmenizdir:

ölümcül: Geçerli bir nesne adı değil b64338b90b4209263b50244d18278c0999867193

Git'in gelecekteki sürümlerinde çalışmayı durdurabileceği için kullanmayı teşvik etmem. Hangi deponuzu bozabilir.


Bu gerçekten işe yarıyor ama bence IntelliJ'in kafasını karıştırıyor ...: |
rogerdpack

Bu dezavantajları olmayan buna dayanarak daha iyi bir çözüm oluşturdum: stackoverflow.com/a/58543445/277882
ntninja

7

Birçok kişi bu soruyu zaten yanıtladı. Buraya bir PowerShell sürümü eklemeniz yeterli.

Dizindeki tüm boş klasörleri bulun

Buraya boş bir .gitkeep dosyası ekleyin

Get-ChildItem 'Path to your Folder' -Recurse -Directory | Where-Object {[System.IO.Directory]::GetFileSystemEntries($_.FullName).Count -eq 0} | ForEach-Object { New-Item ($_.FullName + "\.gitkeep") -ItemType file}

Nice.‌‌ ༼ ͡☉ ͜ʖ ͡☉ ༽
AteşlemeSquadWitness

6

Birden çok semantik dizinde çok fazla geçici veri barındıracak bir klasör eklemek istiyorsanız, bir yaklaşım kökünüze böyle bir şey eklemektir.

/app/data/**/*.* !/app/data/**/*.md

Ardından, dizinlerin tümünün repo'nun bir *.mdparçası olarak kalmasını sağlamak için her dizinde açıklayıcı README.md dosyalarını (veya boş dosyaları, bu durumda olduğu gibi benzersiz bir şekilde hedefleyebildiğiniz sürece ) uygulayabilirsiniz. dosyalar (uzantılı) yok sayılır. SINIRLAMA: .dizin adlarında izin verilmiyor!

Bu dizinlerin tümünü xml / images dosyaları veya başka bir şeyle doldurabilir ve /app/data/uygulamanız için depolama alanı ihtiyaçları geliştikçe zaman içinde daha fazla dizin ekleyebilirsiniz (README.md dosyaları, her bir depolama dizininin ne için olduğunu açıklamaya yardımcı olur) kesinlikle).

Her yeni dizin için yeni bir dizin .gitignoreoluşturarak, hesabınızı daha fazla değiştirmenize ya da merkezileştirmenize gerek yoktur .gitignore. Muhtemelen en akıllı çözüm değil ama gitignore-bilge terse ve her zaman benim için çalışıyor. Güzel ve basit! ;)

resim açıklamasını buraya girin


6

Bunu yapmanın kolay bir yolu, .gitkeepşu anda boş tutmak istediğiniz dizine bir dosya eklemektir .

Daha fazla bilgi için bu SOF cevabına bakın - bu da bazı kişilerin neden bir .gitignore dosyası eklemek için rekabet kuralını bulduklarını açıklar (burada birçok yanıtta belirtildiği gibi).


4

Fray'a bir seçenek daha eklemek.

Bir dizin eklemek istediğinizi varsayarsak git, bununla ilgili tüm amaçlar için gitboş kalmalı ve içeriklerinin hiçbir zaman izlenmemesini sağlayın, .gitignoreburada birçok kez önerildiği gibi, hile yapacağız.

Belirtildiği gibi biçim:

*
!.gitignore

Şimdi, bunu komut satırında yapmanın bir yolunu istiyorsanız, eklemek istediğiniz dizinin içindeyken tek bir geçişte, şunları yürütebilirsiniz:

$ echo "*" > .gitignore && echo '!.gitignore' >> .gitignore && git add .gitignore

Kendim, bunu yapmak için kullandığım bir kabuk komut dosyası var. Komut dosyasını dilediğiniz gibi adlandırın ve ekleme yolunuzda bir yere ekleyin veya doğrudan referans verin:

#!/bin/bash

dir=''

if [ "$1" != "" ]; then
    dir="$1/"
fi

echo "*" > $dir.gitignore && \
echo '!.gitignore' >> $dir.gitignore && \
git add $dir.gitignore

Bununla, eklemek istediğiniz dizinin içinden yürütebilir veya ilk ve tek parametre olarak dizine başvurabilirsiniz:

$ ignore_dir ./some/directory

Bunu boş bir klasör izlemek istiyorsanız (@GreenAsJade tarafından bir açıklama cevaben) Başka bir seçenek, MAYIS gelecekte izlenen dosyaları içeren ama şimdilik boş olacak, ommit olabilir *gelen .gitignoredosyaya ve kontrol o içinde. Temelde, tüm dosya " beni görmezden gelme " diyor, ama aksi takdirde, dizin boş ve izlenir.

Kişisel .gitignoredosya gibi görünecektir:

!.gitignore

Hepsi bu, kontrol edin ve dosyaları daha sonra izleyebileceğiniz boş, ancak izlenen bir dizininiz var.

Dosyada bir satır tutmayı önermemin sebebi .gitignoreamacını vermesidir . Aksi takdirde, hatta bir kısmı onu kaldırmayı düşünebilir. Çizginin üstüne bir yorum yaparsanız yardımcı olabilir.


4

Bazen "gerçek" boş ve varolan bir dizine ihtiyaç duyan kötü yazılmış kütüphanelerle veya yazılımlarla uğraşmanız gerekir. Basit koymak .gitignoreveya .keepkırmak ve bir hataya neden olabilir. Aşağıdakiler bu durumlarda yardımcı olabilir, ancak garanti yoktur ...

Önce gerekli dizini oluşturun:

mkdir empty

Daha sonra bu dizine bozuk bir sembolik bağlantı eklersiniz (ancak yukarıda açıklanan kullanım durumundan başka bir durumda, lütfen READMEbir açıklama ile a kullanın ):

ln -s .this.directory empty/.keep

Bu dizindeki dosyaları yok saymak için kök dizine ekleyebilirsiniz .gitignore:

echo "/empty" >> .gitignore

Yok sayılan dosyayı eklemek için, zorlamak üzere bir parametre kullanın:

git add -f empty/.keep

İşlemden sonra dizininizde bozuk bir sembolik bağ vardır ve git dizini oluşturur. Bozuk bağın bazı avantajları vardır, çünkü normal bir dosya değildir ve normal bir dosyaya işaret etmez. Bu yüzden bile (dosya içermeyen) sorusunun bir kısmına uyuyor, niyetle değil, anlamıyla, sanırım:

find empty -type f

Bu dizinde dosya bulunmadığından, bu komutlar boş bir sonuç gösterir. Bu nedenle, bir dizindeki tüm dosyaları alan çoğu uygulama, en azından bir "dosya var" veya "okunabilir" yaparlarsa, genellikle bu bağlantıyı görmezler. Bazı komut dosyaları bile hiçbir dosya bulamaz:

$ php -r "var_export(glob('empty/.*'));"
array (
  0 => 'empty/.',
  1 => 'empty/..',
)

Ancak bu çözümü sadece özel durumlarda kullanmanızı şiddetle tavsiye ederim, READMEboş bir dizinde yazılmış iyi bir şey genellikle daha iyi bir çözümdür. (Ve bunun bir Windows dosya sistemi ile çalışıp çalışmadığını bilmiyorum ...)


4

Okuma @ofavre 'ın ve @ stanislav-bashkyrtsev GIT dizinleri oluşturmak için kırık GIT alt modülü başvurularını kullanarak' ın cevapları, kimsenin her şey akıllı ve güvenli hale getirmek için fikrin henüz bu basit değişiklik önerisinde bulunduğunu söyledi şaşırdım:

Sahte bir alt modülü GIT'e kesmek yerine , boş bir gerçek modül ekleyin .

Şunu girin: https://gitlab.com/empty-repo/empty.git

Tam olarak bir taahhüt içeren bir GIT deposu:

commit e84d7b81f0033399e325b8037ed2b801a5c994e0
Author: Nobody <none>
Date: Thu Jan 1 00:00:00 1970 +0000

Mesaj yok, taahhütlü dosya yok.

kullanım

GIT deposunuza boş bir dizin eklemek için:

git submodule add https://gitlab.com/empty-repo/empty.git path/to/dir

Mevcut tüm boş dizinleri alt modüllere dönüştürmek için:

find . -type d -empty -delete -exec git submodule add -f https://gitlab.com/empty-repo/empty.git \{\} \;

Git, alt modül referansını oluştururken en son işleme karmasını saklayacaktır, bu nedenle kötü amaçlı dosyaları enjekte etmek için bunu (veya GitLab) benim için endişelenmenize gerek yoktur. Maalesef ödeme sırasında hangi taahhüt kimliğinin kullanıldığını zorlamanın bir yolunu bulamadım, bu nedenle repo ekledikten sonra referans taahhüt kimliğinin e84d7b81f0033399e325b8037ed2b801a5c994e0kullandığını manuel olarak kontrol etmeniz gerekecek git submodule status.

Hala yerli bir çözüm değil, ama muhtemelen GIT kod tabanında gerçekten , gerçekten kirli biri ellerini almadan en iyi olabilir .

Ek: Bu taahhüdü yeniden oluşturma

Bu kesin taahhüdü (boş bir dizinde) kullanarak yeniden oluşturabilmelisiniz:

# Initialize new GIT repository
git init

# Set author data (don't set it as part of the `git commit` command or your default data will be stored as “commit author”)
git config --local user.name "Nobody"
git config --local user.email "none"

# Set both the commit and the author date to the start of the Unix epoch (this cannot be done using `git commit` directly)
export GIT_AUTHOR_DATE="Thu Jan 1 00:00:00 1970 +0000"
export GIT_COMMITTER_DATE="Thu Jan 1 00:00:00 1970 +0000"

# Add root commit
git commit --allow-empty --allow-empty-message --no-edit

Tekrarlanabilir GIT taahhütleri oluşturmak şaşırtıcı derecede zor…


3

Yapamazsın. Bu, Git sahipleri tarafından kasıtlı bir tasarım kararıdır. Temel olarak, Git gibi bir Kaynak Kodu Yönetim Sisteminin amacı kaynak kodunu yönetmektir ve boş dizinler kaynak kodu değildir. Git de genellikle içerik izleyici olarak tanımlanır ve yine, boş dizinler içerik değildir (aslında tam tersi), bu yüzden izlenmezler.


60
Bu görüşe itiraz ediyorum. Yapı içeriğidir ve her şey isim içeriğe katkıda bulunur.
ThomasH

20
Boş bir dosya da kaynak kodu veya içerik değildir. Bu sadece bir isim. Ancak Git, boş dosyaları mutlu bir şekilde izleyecektir. Git'in boş dizinleri izlemeyi reddetmesinin kasıtlı bir tasarım kararı olduğunu düşünmüyorum. Boş dizinleri izlemek, sadece% 99 zamana ihtiyaç duymayan bir özellik olduğunu düşünüyorum, bu yüzden düzgün çalışması için gerekli ekstra işi yapmak için uğraşmadılar. Birisi özelliği uygulamak için yeterince kötü istiyorsa Git bunu yapabilir. Git bakıcılarının doğru bir şekilde yapılmaları halinde böyle bir yamaya karşı çıkacaklarından şüpheliyim.
Dan Moulding

1
@TobyAllen burada güncellenmiş SSS bağlantısıdır. En iyi yanıt, SSS tarafından daha kesin talimatlarla önerilen şeydir.
Daniel Da Cunha

3
Eksik bir özellik (ve düşük öncelik), kasıtlı bir sınırlama değil. Git SSS'den: Şu anda Git endeksinin (hazırlama alanı) tasarımı sadece dosyaların listelenmesine izin veriyor ve boş dizinlere izin verecek değişikliği yapmaya yetecek hiç kimse bu durumu düzeltmek için yeterince önemsemedi.
jbo5112

Gerçekten katılma. Boş bir klasörü izlemek istememin çeşitli nedenlerini bulabilirim. Örneğin, projelerim için çok hafif bir PHP MVC çerçevesi geliştiriyorum. Model, görünüm vb. Yerleştirmek için belirli klasörlerim var. Çerçeveme dayalı yeni bir site yaptığımda, varsayılan olarak hiçbir model veya görünüm olmadığı için bu klasörler boş, ancak klasörün var olması gerekiyor, aksi takdirde çerçevem ​​kazandı çalışmıyor!
Gladen

2

Bu kodu create_readme.php olarak kaydedebilir ve Git projenizin kök dizininden PHP kodunu çalıştırabilirsiniz .

> php create_readme.php

Boş olan tüm dizinlere README dosyaları ekler, böylece bu dizinler daha sonra dizine eklenir.

<?php
    $path = realpath('.');
    $objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path),       RecursiveIteratorIterator::SELF_FIRST);
    foreach($objects as $name => $object){
        if ( is_dir($name) && ! is_empty_folder($name) ){
            echo "$name\n" ;
            exec("touch ".$name."/"."README");
        }
    }

    function is_empty_folder($folder) {
        $files = opendir($folder);
        while ($file = readdir($files)) {
            if ($file != '.' && $file != '..')
                return true; // Not empty
            }
        }
?>

Sonra yap

git commit -m "message"
git push
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.