Git deposuna boş bir dizini (dosya içermeyen) nasıl ekleyebilirim?
Git deposuna boş bir dizini (dosya içermeyen) nasıl ekleyebilirim?
Yanıtlar:
Bir dizini (neredeyse) boş (depoda) yapmanın başka bir yolu, .gitignore
bu 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".
README
içine koyacağınız belgeleri yazıyorum .gitignore
(yorumlar olarak).
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.
git mv
, git yeni dizinin sürüm kontrolü altında olmadığından şikayet edeceği için bunu
.gitignore
Hile sık cevaptır ve tatmin birçok ihtiyaçlarını. Ancak git
.gitkeep
Bu amaç için boş bir dosya kullanan birçok depo gördüm .
Dizinde boş bir dosya oluşturun .gitkeep
ve ekleyin.
.gitkeep
Git 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.
.git
Önek sözleşmesi ayrılmalıdır ..." Neden? Git bu rezervasyonu talep ediyor mu?
README
veya ABOUT
dosya aynı derecede iyi veya daha iyi olur. Tıpkı hepimizin URL'lerden önce yaptığı gibi, bir sonraki adam için bir not bırakmak.
Her zaman README dosyasını dizinde, depoda neden boş, aksi halde bu dizinin olmasını istediğinizin açıklandığı bir yere koyabilirsiniz.
touch .keep
Linux'ta bu, adlı boş bir dosya oluşturur .keep
. Değeri ne .gitkeep
olursa 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ı README
veya README.md
dosya içerebilir .
Tabii ki bu dosyanın varlığının uygulamanızın bozulmasına neden olmamasını gerektirir.
.keep
veya sadece dikkate almayın. Bunun yerine dizindeki dosyalar göz ardı edilecekse, bu tamamen farklı bir sorudur.
git clean -nd | sed s/'^Would remove '// | xargs -I{} touch "{}.keep"
izlenmeyen tüm boş dizinlerde gerçekleştireceği önerildi .
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:
cache/
logs/
.gitignore
Birçok kullanıcı şunları önerir:
README
Dizini boş bırakmak için bir dosya veya başka bir içeriğe sahip başka bir dosya yerleştirme veya.gitignore
Sonunda 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.
.gitignore
bir şey ( dosyaları tutmak ) yapmak için kullanıyorsunuz ?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 .gitignore
istenmeyen 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
.gitkeep
Yaklaşımı Laravel , Angular-CLI gibi çok önemli çerçevelerin benimsediğini gördüm .
.gitkeep
benim 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?
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 .gitignore
yalnızca dosya içeriyorsa yeterince boşsa , yalnızca aşağıdaki .gitignore
dizinlerde boş dizinlerde dosya oluşturabilirsiniz :
find . -type d -empty -exec touch {}/.gitignore \;
find . -name .git -prune -o -type d -empty -exec touch {}/.gitignore \;
find * -type d -empty -exec touch {}/.gitignore \;
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!
.gitignore
üzerinde bir şey eklemenin hiçbir etkisi yoktur . Benim yorumum, bir dizin ağacındaki dosyaları kaldırmakla ilgilidir , böylece bayrak uygulanabilir. -empty
find
.DS_Store
-empty
Andy Lester haklı, ancak dizininizin boş olması ve boş olmaması gerekiyorsa, .gitignore
geç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.
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.
Git boş dizinleri izlemez. Daha fazla açıklama için Git SSS bölümüne bakın . Önerilen geçici çözüm, .gitignore
boş dizine bir dosya koymaktır . Bu çözümü sevmiyorum, çünkü .gitignore
Unix 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
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!
Boş dizininizi oluşturun:
$ mkdir path/to/empty-folder
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).
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, cd
içine git write-tree
boş 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-index
yeniden yazmasıdır .040000 tree
160000 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.
git svn dcommit
, istenen sonuçla bu mümkün müdür ?
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.
echo bla > file
, file: File exists
çünkü >
zaten oradaysa dosyanın üzerine yazacak veya yoksa yeni bir dosya oluşturacaksınız.
/bin/sh
kültürel varsayım! * Eğer "burada" csh
ve değişken noclobber
ayarlanmış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
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
.generated
Dizin 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.
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
@ 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
.gitkeep
Dosyaları 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. .gitkeep
Dosyaları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.
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.
Bir .gitignore
dosya 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. .
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.
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ış.
find . -type d -empty -print0 | xargs --null bash -c 'for a; do { echo "*"; echo "!.gitignore"; } >>"$a/.gitignore"; done' --
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
, /tmp
ya /cache
ve klasör boş kalacak.
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.
.gitkeep
Kongre çok daha iyi bir uygulamadır.
İşte bir hack, ama işe yaraması komik (Git 2.2.1). @Teka'nın önerdiğine benzer, ancak hatırlaması daha kolay:
git submodule add path_to_repo
).submodules
. Bir değişiklik yapın..submodules
Dosyayı 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.
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}
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 *.md
parç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 .gitignore
oluş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! ;)
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).
Fray'a bir seçenek daha eklemek.
Bir dizin eklemek istediğinizi varsayarsak git
, bununla ilgili tüm amaçlar için git
boş kalmalı ve içeriklerinin hiçbir zaman izlenmemesini sağlayın, .gitignore
burada 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 .gitignore
dosyaya ve kontrol o içinde. Temelde, tüm dosya " beni görmezden gelme " diyor, ama aksi takdirde, dizin boş ve izlenir.
Kişisel .gitignore
dosya 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 .gitignore
amacını vermesidir . Aksi takdirde, hatta bir kısmı onu kaldırmayı düşünebilir. Çizginin üstüne bir yorum yaparsanız yardımcı olabilir.
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 .gitignore
veya .keep
kı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 README
bir 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, README
boş 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 ...)
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 .
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.
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 e84d7b81f0033399e325b8037ed2b801a5c994e0
kullandığı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 .
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…
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.
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
checkout
Ancak Git'in şu anki sürümlerinde olmayacak .