Bagaimana saya bisa menambahkan direktori kosong (yang tidak mengandung file) ke repositori Git?
Bagaimana saya bisa menambahkan direktori kosong (yang tidak mengandung file) ke repositori Git?
Jawaban:
Cara lain untuk membuat direktori tetap (hampir) kosong (di repositori) adalah membuat .gitignore
file di dalam direktori yang berisi empat baris ini:
# Ignore everything in this directory
*
# Except this file
!.gitignore
Maka Anda tidak harus mendapatkan urutan yang benar seperti yang harus Anda lakukan dalam solusi m104 .
Ini juga memberikan manfaat bahwa file dalam direktori itu tidak akan muncul sebagai "tidak terlacak" ketika Anda melakukan status git.
Membuat komentar @GreenAsJade tetap ada:
Saya pikir perlu dicatat bahwa solusi ini melakukan persis apa yang ditanyakan oleh pertanyaan itu, tetapi mungkin bukan apa yang dicari oleh banyak orang pada pertanyaan ini. Solusi ini menjamin bahwa direktori tetap kosong. Itu mengatakan "Aku benar-benar tidak ingin file diperiksa di sini". Berbeda dengan "Saya belum punya file untuk check in di sini, tapi saya perlu direktori di sini, file mungkin akan datang nanti".
README
dalam .gitignore
file (sebagai komentar).
Kamu tidak bisa Lihat FAQ Git .
Saat ini desain indeks git (area pementasan) hanya memungkinkan file untuk didaftar, dan tidak ada yang cukup kompeten untuk membuat perubahan untuk memungkinkan direktori kosong telah cukup peduli tentang situasi ini untuk memperbaikinya.
Direktori ditambahkan secara otomatis ketika menambahkan file di dalamnya. Yaitu, direktori tidak perlu ditambahkan ke repositori, dan tidak dilacak sendiri.
Anda bisa mengatakan "
git add <dir>
" dan itu akan menambah file di sana.Jika Anda benar-benar membutuhkan direktori untuk ada di checkout Anda harus membuat file di dalamnya. .gitignore berfungsi dengan baik untuk tujuan ini; Anda dapat membiarkannya kosong, atau mengisi nama file yang Anda harapkan muncul di direktori.
git mv
karena git akan mengeluh bahwa direktori baru tidak berada di bawah kontrol versi
.gitignore
trick adalah jawaban sering, dan memenuhi banyak kebutuhan. Namun itu mungkin untuk membuat git melacak direktori yang benar - benar kosong , lihat jawaban saya
.gitkeep
untuk tujuan ini.
Buat file kosong yang disebut .gitkeep
di direktori, dan tambahkan itu.
.keep
sebagai gantinya.
.gitkeep
belum ditentukan oleh Git dan akan membuat orang lain menebak artinya, yang akan mengarahkan mereka ke pencarian google, yang akan mengarahkan mereka ke sini. The .git
konvensi awalan harus disediakan untuk file dan direktori yang Git itu sendiri menggunakan.
.git
Konvensi awalan harus disediakan ..." Mengapa? Apakah git meminta reservasi ini?
README
atau ABOUT
akan sama baiknya atau lebih baik. Meninggalkan catatan untuk orang berikutnya, sama seperti kita semua dulu melakukannya sebelum URL.
Anda selalu bisa meletakkan file README di direktori dengan penjelasan mengapa Anda menginginkan ini, jika tidak, direktori kosong dalam repositori.
touch .keep
Di Linux, ini membuat file kosong bernama .keep
. Untuk apa nilainya, nama ini agnostik untuk Git, sedangkan .gitkeep
khusus untuk Git. Kedua, seperti yang dicatat oleh pengguna lain, .git
konvensi awalan harus disediakan untuk file dan direktori yang digunakan Git sendiri.
Atau, seperti dicatat dalam jawaban lain , direktori dapat berisi file README
atauREADME.md
deskriptif .
Tentu saja ini mensyaratkan bahwa kehadiran file tidak akan menyebabkan aplikasi Anda rusak.
.keep
file atau abaikan saja. Jika alih-alih file dalam direktori diabaikan, itu adalah pertanyaan yang berbeda sama sekali.
git clean -nd | sed s/'^Would remove '// | xargs -I{} touch "{}.keep"
akan melakukan ini di semua direktori kosong yang tidak terlacak.
Hal pertama yang pertama:
Direktori kosong tidak dapat menjadi bagian dari pohon di bawah sistem versi Git .
Itu tidak akan dilacak. Tetapi ada beberapa skenario di mana "versi" direktori kosong dapat bermakna, misalnya:
cache/
atau logs/
, di mana kami ingin memberikan folder tetapi .gitignore
isinyaBanyak pengguna menyarankan:
README
file atau file lain dengan beberapa konten untuk membuat direktori tidak kosong, atau.gitignore
file dengan semacam "logika kebalikan" (yaitu untuk memasukkan semua file) yang, pada akhirnya, melayani tujuan pendekatan yang sama # 1.Walaupun kedua solusi pasti bekerja, saya menemukan mereka tidak konsisten dengan pendekatan yang bermakna untuk versi Git.
.gitignore
untuk melakukan sesuatu ( menyimpan file) yang sangat berlawanan dengan apa artinya ( tidak termasuk file), meskipun itu mungkin?Gunakan file kosong yang dipanggil .gitkeep
untuk memaksa keberadaan folder di sistem versi.
Meskipun sepertinya tidak ada perbedaan besar:
Anda menggunakan file yang memiliki tujuan tunggal menjaga folder. Anda tidak memasukkan informasi yang tidak ingin Anda masukkan.
Misalnya, Anda harus menggunakan README sebagai, well, README dengan informasi yang bermanfaat, bukan sebagai alasan untuk menyimpan folder.
Pemisahan masalah selalu merupakan hal yang baik, dan Anda masih dapat menambahkan .gitignore
untuk mengabaikan file yang tidak diinginkan.
Memberinya nama .gitkeep
membuatnya sangat jelas dan langsung dari nama file itu sendiri (dan juga untuk pengembang lain , yang baik untuk proyek bersama dan salah satu tujuan inti dari repositori Git) bahwa file ini
Saya telah melihat .gitkeep
pendekatan yang diadopsi oleh kerangka kerja yang sangat penting seperti Laravel , Angular-CLI .
.gitkeep
dengan nama file non git-awalan lain yang Anda dapatkan upvote saya, saya pikir ini adalah jawaban terbaik dan paling informatif. Alasan: Saya pikir ".git *" harus disediakan untuk file yang ditentukan git, sementara ini hanyalah placeholder belaka. Tebakan pertama saya ketika saya melihat bahwa misalnya file ".gitkeep" akan diabaikan secara otomatis (itu akan menjadi fitur yang bagus) tetapi bukan itu masalahnya, kan?
Seperti yang dijelaskan dalam jawaban lain, Git tidak dapat mewakili direktori kosong di area pementasannya. (Lihat FAQ Git .) Namun, jika, untuk tujuan Anda, direktori cukup kosong jika hanya berisi .gitignore
file, maka Anda dapat membuat .gitignore
file dalam direktori kosong hanya melalui:
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 {} \;
dan kemudian menggunakan varian yang disukai dari jawaban ini. Pastikan untuk hanya menjalankan ini di folder yang benar!
.gitignore
tidak memiliki pengaruh pada -empty
bendera find
perintah. Komentar saya adalah tentang menghapus .DS_Store
file di pohon direktori, sehingga -empty
flag dapat diterapkan.
Andy Lester benar, tetapi jika direktori Anda hanya perlu kosong, dan tidak kosong kosong, Anda dapat meletakkan .gitignore
file kosong di sana sebagai solusinya.
Selain itu, ini adalah masalah implementasi, bukan masalah desain penyimpanan Git yang mendasar. Seperti yang telah disebutkan berkali-kali di milis Git, alasan bahwa ini belum dilaksanakan adalah bahwa tidak ada yang cukup peduli untuk mengirimkan tambalan untuk itu, bukan karena itu tidak bisa atau tidak boleh dilakukan.
Cara pembuatan folder log Ruby on Rails :
mkdir log && touch log/.gitkeep && git add log/.gitkeep
Sekarang direktori log akan dimasukkan dalam pohon. Ini sangat berguna ketika digunakan, jadi Anda tidak perlu menulis rutin untuk membuat direktori log.
File log dapat dicegah dengan mengeluarkan,
echo log/dev.log >> .gitignore
tetapi Anda mungkin tahu itu.
Git tidak melacak direktori kosong. Lihat FAQ Git untuk penjelasan lebih lanjut. Solusi yang disarankan adalah meletakkan .gitignore
file di direktori kosong. Saya tidak suka solusi itu, karena .gitignore
"disembunyikan" oleh konvensi Unix. Juga tidak ada penjelasan mengapa direktori kosong.
Saya sarankan untuk meletakkan file README di direktori kosong yang menjelaskan mengapa direktori itu kosong dan mengapa perlu dilacak di Git. Dengan file README di tempat, sejauh menyangkut Git, direktori tidak lagi kosong.
Pertanyaan sebenarnya adalah mengapa Anda perlu direktori kosong di git? Biasanya Anda memiliki semacam skrip build yang dapat membuat direktori kosong sebelum dikompilasi / dijalankan. Jika tidak maka buat satu. Itu adalah solusi yang jauh lebih baik daripada meletakkan direktori kosong di git.
Jadi Anda punya beberapa alasan mengapa Anda memerlukan direktori kosong di git. Masukkan alasan itu di file README. Dengan begitu pengembang lain (dan masa depan Anda) tahu mengapa direktori kosong harus ada di sana. Anda juga akan tahu bahwa Anda dapat menghapus direktori kosong ketika masalah yang membutuhkan direktori kosong telah diselesaikan.
Untuk membuat daftar setiap direktori kosong gunakan perintah berikut:
find -name .git -prune -o -type d -empty -print
Untuk membuat README placeholder di setiap direktori kosong:
find -name .git -prune -o -type d -empty -exec sh -c \
"echo this directory needs to be empty because reasons > {}/README.emptydir" \;
Untuk mengabaikan semua yang ada di direktori kecuali file README masukkan baris berikut di Anda .gitignore
:
path/to/emptydir/*
!path/to/emptydir/README.emptydir
path/to/otheremptydir/*
!path/to/otheremptydir/README.emptydir
Atau, Anda bisa mengecualikan setiap file README dari diabaikan:
path/to/emptydir/*
path/to/otheremptydir/*
!README.emptydir
Untuk membuat daftar setiap README setelah mereka dibuat:
find -name README.emptydir
PERINGATAN: Tweak ini tidak benar-benar berfungsi karena ternyata. Maaf untuk ketidaknyamanannya.
Posting asli di bawah ini:
Saya menemukan solusi saat bermain dengan internal Git!
Buat direktori kosong Anda:
$ mkdir path/to/empty-folder
Tambahkan ke indeks menggunakan perintah pipa ledeng dan pohon kosong SHA-1 :
$ git update-index --index-info
040000 tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 path/to/empty-folder
Ketikkan perintah dan kemudian masukkan baris kedua. Tekan Enterdan kemudian Ctrl+ Duntuk menghentikan input Anda. Catatan: formatnya adalah mode [SPACE] ketik [SPACE] SHA-1hash [TAB] path (tab ini penting, format jawaban tidak melestarikannya).
Itu dia! Folder kosong Anda ada di indeks Anda. Yang harus Anda lakukan adalah berkomitmen.
Solusi ini singkat dan tampaknya berfungsi dengan baik ( lihat EDIT! ), Tetapi tidak mudah untuk diingat ...
Pohon kosong SHA-1 dapat ditemukan dengan membuat repositori Git kosong baru, cd
ke dalamnya dan mengeluarkan git write-tree
, yang menampilkan pohon kosong SHA-1.
EDIT:
Saya telah menggunakan solusi ini sejak saya menemukannya. Tampaknya berfungsi persis seperti membuat submodule, kecuali tidak ada modul yang didefinisikan di mana pun. Ini menyebabkan kesalahan saat menerbitkan git submodule init|update
. Masalahnya adalah yang git update-index
menulis ulang 040000 tree
bagian menjadi 160000 commit
.
Selain itu, setiap file yang ditempatkan di bawah jalur itu tidak akan pernah dilihat oleh Git, karena dianggap milik beberapa repositori lainnya. Ini buruk karena dapat dengan mudah diabaikan!
Namun, jika Anda belum (dan tidak akan) menggunakan submitula Git dalam repositori Anda, dan folder "kosong" akan tetap kosong atau jika Anda ingin Git mengetahui keberadaannya dan mengabaikan isinya, Anda dapat pergi dengan tweak ini. Pergi seperti biasa dengan submodul mengambil lebih banyak langkah yang men-tweak ini.
git svn dcommit
itu dengan hasil yang diinginkan?
Katakanlah Anda memerlukan direktori kosong bernama tmp :
$ mkdir tmp
$ touch tmp/.gitignore
$ git add tmp
$ echo '*' > tmp/.gitignore
$ git commit -m 'Empty directory' tmp
Dengan kata lain, Anda perlu menambahkan file .gitignore ke indeks sebelum Anda dapat memberitahu Git untuk mengabaikannya (dan semua yang lain di direktori kosong).
echo bla > file
Anda tidak akan mendapatkannya file: File exists
karena >
akan menimpa file jika sudah ada atau membuat yang baru jika tidak ada.
/bin/sh
asumsi budaya! * Jika "di sini" adalah csh
dan variabel noclobber
ditetapkan, Anda memang akan mendapatkannya file: File exists
. Jika seseorang berkata "Saya mendapatkan ini", jangan menganggap mereka idiot dan menjawab "Tidak, kamu tidak". * c2.com/cgi/wiki?AmericanCulturalAssumption
Mungkin menambahkan direktori kosong sepertinya itu akan menjadi jalan perlawanan paling tidak karena Anda memiliki skrip yang mengharapkan direktori itu ada (mungkin karena itu adalah target untuk binari yang dihasilkan). Pendekatan lain adalah memodifikasi skrip Anda untuk membuat direktori sesuai kebutuhan .
mkdir --parents .generated/bin ## create a folder for storing generated binaries
mv myprogram1 myprogram2 .generated/bin ## populate the directory as needed
Dalam contoh ini, Anda mungkin memeriksa tautan simbolis (rusak) ke direktori sehingga Anda dapat mengaksesnya tanpa awalan ".generated" (tetapi ini opsional).
ln -sf .generated/bin bin
git add bin
Ketika Anda ingin membersihkan pohon sumber Anda, Anda bisa:
rm -rf .generated ## this should be in a "clean" script or in a makefile
Jika Anda mengambil pendekatan yang sering disarankan untuk memeriksa di folder yang hampir kosong, Anda memiliki sedikit kompleksitas menghapus konten tanpa juga menghapus file ".gitignore".
Anda dapat mengabaikan semua file yang dibuat dengan menambahkan berikut ini ke root .gitignore Anda:
.generated
.generated
direktori awalnya tidak ada. Tidak akan lagi rusak begitu Anda membangunnya.
Saya telah menghadapi masalah dengan direktori kosong juga. Masalah dengan menggunakan file placeholder adalah bahwa Anda perlu membuat mereka, dan menghapusnya, jika mereka tidak diperlukan lagi (karena nanti ada ditambahkan sub-direktori atau file. Dengan pohon sumber besar mengelola file placeholder ini bisa rumit dan kesalahan Rentan.
Inilah sebabnya saya memutuskan untuk menulis alat sumber terbuka yang dapat mengelola pembuatan / penghapusan file placeholder secara otomatis. Ini ditulis untuk platform .NET dan berjalan di bawah Mono (.NET untuk Linux) dan Windows.
Lihat saja: http://code.google.com/p/markemptydirs
Saya suka jawaban oleh @ Artur79 dan @mjs jadi saya telah menggunakan kombinasi keduanya dan menjadikannya standar untuk proyek kami.
find . -type d -empty -exec touch {}/.gitkeep \;
Namun, hanya segelintir pengembang kami yang bekerja di Mac atau Linux. Banyak pekerjaan pada Windows dan saya tidak dapat menemukan satu-liner sederhana yang setara untuk mencapai hal yang sama di sana. Beberapa cukup beruntung memiliki Cygwin yang diinstal karena alasan lain, tetapi meresepkan Cygwin hanya untuk ini sepertinya berlebihan.
Edit untuk solusi yang lebih baik
Jadi, karena sebagian besar pengembang kami sudah menginstal Ant , hal pertama yang saya pikirkan adalah mengumpulkan file build Ant untuk menyelesaikan ini secara independen dari platform. Ini masih dapat ditemukan di sini
Namun , saya kemudian berpikir Akan lebih baik untuk membuat ini menjadi perintah utilitas kecil, jadi saya membuatnya kembali menggunakan Python dan menerbitkannya ke PyPI di sini . Anda dapat menginstalnya hanya dengan menjalankan:
pip3 install gitkeep2
Ini akan memungkinkan Anda untuk membuat dan menghapus .gitkeep
file secara rekursif, dan itu juga akan memungkinkan Anda untuk menambahkan pesan kepada mereka untuk rekan-rekan Anda untuk memahami mengapa direktori itu penting. Bit terakhir ini adalah bonus. Saya pikir akan lebih baik jika .gitkeep
file bisa didokumentasikan sendiri.
$ 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.
Semoga bermanfaat.
Anda tidak bisa dan sayangnya tidak akan pernah bisa. Ini adalah keputusan yang dibuat oleh Linus Torvald sendiri. Dia tahu apa yang baik untuk kita.
Ada kata-kata kasar di luar sana yang pernah saya baca.
Saya menemukan Re: Direktori kosong .. , tapi mungkin ada yang lain.
Anda harus hidup dengan solusi ... sayangnya.
Ketika Anda menambahkan .gitignore
file, jika Anda akan meletakkan jumlah konten apa pun di dalamnya (yang Anda ingin Git abaikan) Anda mungkin ingin menambahkan satu baris hanya dengan tanda bintang *
untuk memastikan Anda tidak menambahkan konten yang diabaikan secara tidak sengaja .
Tidak ada cara untuk membuat Git melacak direktori, jadi satu-satunya solusi adalah menambahkan file placeholder dalam direktori yang Anda ingin Git lacak.
File dapat dinamai dan mengandung apa pun yang Anda inginkan, tetapi kebanyakan orang menggunakan file kosong bernama .gitkeep
(meskipun beberapa orang lebih suka VCS-agnostik .keep
).
Awalan .
menandainya sebagai file tersembunyi.
Gagasan lain adalah menambahkan README
file yang menjelaskan direktori apa yang akan digunakan.
Seperti disebutkan itu tidak mungkin untuk menambahkan direktori kosong, tetapi di sini ada satu liner yang menambahkan file .gitignore kosong ke semua direktori.
ruby -e 'require "fileutils" ; Dir.glob(["target_directory","target_directory/**"]).each { |f| FileUtils.touch(File.join(f, ".gitignore")) if File.directory?(f) }'
Saya terjebak ini di Rakefile untuk akses mudah.
find . -type d -empty -print0 | xargs --null bash -c 'for a; do { echo "*"; echo "!.gitignore"; } >>"$a/.gitignore"; done' --
Solusi dari Jamie Flournoy sangat bagus. Ini adalah versi yang sedikit disempurnakan untuk menjaga .htaccess
:
# Ignore everything in this directory
*
# Except this file
!.gitignore
!.htaccess
Dengan solusi ini Anda dapat membuat folder kosong, misalnya /log
, /tmp
atau /cache
dan folder tersebut akan tetap kosong.
Saya selalu membangun fungsi untuk memeriksa struktur folder yang saya inginkan dan membangunnya untuk saya dalam proyek. Ini mengatasi masalah ini karena folder kosong disimpan di Git oleh proxy.
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");
}
Ini dalam PHP, tetapi saya yakin sebagian besar bahasa mendukung fungsi yang sama, dan karena pembuatan folder diurus oleh aplikasi, folder akan selalu ada.
.gitkeep
konvensi adalah praktek yang lebih baik banyak.
Ini adalah retasan, tetapi lucu bahwa ini berhasil (Git 2.2.1). Mirip dengan apa yang disarankan @Teka, tetapi lebih mudah diingat:
git submodule add path_to_repo
).submodules
. Lakukan perubahan..submodules
file dan lakukan perubahan.Sekarang, Anda memiliki direktori yang akan dibuat ketika komit diperiksa. Namun hal yang menarik adalah bahwa jika Anda melihat konten objek pohon dari file ini Anda akan mendapatkan:
fatal: Bukan nama objek yang valid b64338b90b4209263b50244d18278c0999867193
Saya tidak akan mendorong untuk menggunakannya karena mungkin berhenti bekerja di versi Git yang akan datang. Yang mungkin membuat repositori Anda rusak.
Banyak yang sudah menjawab pertanyaan ini. Cukup tambahkan versi PowerShell di sini.
Temukan semua folder kosong di direktori
Tambahkan file .gitkeep kosong di sana
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}
Jika Anda ingin menambahkan folder yang akan menampung banyak data sementara di beberapa direktori semantik, maka satu pendekatan adalah menambahkan sesuatu seperti ini ke root Anda. Gitignore ...
/app/data/**/*.*
!/app/data/**/*.md
Kemudian Anda dapat melakukan file deskriptif README.md (atau file kosong, tidak masalah, asalkan Anda dapat menargetkannya secara unik seperti *.md
dalam kasus ini) di setiap direktori untuk memastikan bahwa direktori semua tetap menjadi bagian dari repo tetapi file (dengan ekstensi) tetap diabaikan. PEMBATASAN: .
tidak diizinkan dalam nama direktori!
Anda dapat mengisi semua direktori ini dengan file xml / gambar atau apa pun dan menambahkan lebih banyak direktori di bawah /app/data/
waktu seiring kebutuhan penyimpanan untuk pengembangan aplikasi Anda (dengan file README.md berfungsi untuk membakar dalam deskripsi tentang apa masing-masing direktori penyimpanan untuk persis).
Tidak perlu lagi mengubah .gitignore
atau mendesentralisasi Anda dengan membuat yang baru .gitignore
untuk setiap direktori baru. Mungkin bukan solusi paling cerdas tetapi singkat dan bijaksana selalu bekerja untuk saya. Bagus dan sederhana! ;)
Cara mudah untuk melakukan ini adalah dengan menambahkan .gitkeep
file ke direktori yang Anda inginkan (saat ini) tetap kosong.
Lihat jawaban SOF ini untuk informasi lebih lanjut - yang juga menjelaskan mengapa beberapa orang menemukan konvensi yang bersaing untuk menambahkan file .gitignore (sebagaimana dinyatakan dalam banyak jawaban di sini) membingungkan.
Menambahkan satu opsi lagi ke medan.
Dengan asumsi Anda ingin menambahkan direktori ke sana git
, untuk semua tujuan yang terkait git
, harus tetap kosong dan tidak pernah kontennya dilacak, .gitignore
seperti yang disarankan beberapa kali di sini, akan melakukan trik.
Formatnya, sebagaimana disebutkan, adalah:
*
!.gitignore
Sekarang, jika Anda ingin cara untuk melakukan ini di baris perintah, dalam satu gerakan, sementara di dalam direktori yang ingin Anda tambahkan, Anda dapat menjalankan:
$ echo "*" > .gitignore && echo '!.gitignore' >> .gitignore && git add .gitignore
Saya sendiri, saya memiliki skrip shell yang saya gunakan untuk melakukan ini. Beri nama skrip apa pun yang Anda inginkan, dan tambahkan di suatu tempat di jalur sertakan Anda, atau rujuk langsung:
#!/bin/bash
dir=''
if [ "$1" != "" ]; then
dir="$1/"
fi
echo "*" > $dir.gitignore && \
echo '!.gitignore' >> $dir.gitignore && \
git add $dir.gitignore
Dengan ini, Anda dapat menjalankannya dari dalam direktori yang ingin Anda tambahkan, atau merujuk direktori tersebut sebagai parameter pertama dan satu-satunya:
$ ignore_dir ./some/directory
Pilihan lain (dalam menanggapi komentar oleh @GreenAsJade), jika Anda ingin melacak folder kosong yang MAY berisi file dilacak di masa depan, tetapi akan kosong untuk saat ini, Anda dapat ommit *
dari .gitignore
file, dan periksa bahwa dalam. Pada dasarnya, semua file katakan adalah "jangan abaikan aku ", tetapi sebaliknya, direktori kosong dan dilacak.
.gitignore
File Anda akan terlihat seperti:
!.gitignore
Itu saja, periksa itu, dan Anda memiliki direktori kosong, belum dilacak, di mana Anda dapat melacak file di lain waktu.
Alasan saya menyarankan menjaga satu baris dalam file adalah karena memberikan .gitignore
tujuannya. Jika tidak, seseorang di telepon mungkin berpikir untuk menghapusnya. Mungkin membantu jika Anda memberikan komentar di atas garis.
Terkadang Anda harus berurusan dengan pustaka atau perangkat lunak tertulis yang buruk, yang memerlukan direktori "nyata" kosong dan sudah ada. Menempatkan yang sederhana .gitignore
atau .keep
mungkin mematahkannya dan menyebabkan bug. Berikut ini dapat membantu dalam kasus ini, tetapi tidak ada jaminan ...
Pertama buat direktori yang dibutuhkan:
mkdir empty
Kemudian Anda menambahkan tautan simbolis yang rusak ke direktori ini (tetapi pada kasus lain selain kasus penggunaan yang dijelaskan di atas, silakan gunakan README
dengan penjelasan):
ln -s .this.directory empty/.keep
Untuk mengabaikan file di direktori ini, Anda dapat menambahkannya di root .gitignore
:
echo "/empty" >> .gitignore
Untuk menambahkan file yang diabaikan, gunakan parameter untuk memaksanya:
git add -f empty/.keep
Setelah komit, Anda memiliki tautan simbolis yang rusak dalam indeks Anda dan git membuat direktori. Tautan rusak memiliki beberapa kelebihan, karena tidak ada file biasa dan menunjuk ke tidak ada file biasa. Jadi itu bahkan cocok dengan bagian dari pertanyaan "(yang tidak mengandung file)", bukan karena niat tetapi dengan artinya, saya kira:
find empty -type f
Perintah ini menunjukkan hasil kosong, karena tidak ada file di direktori ini. Jadi sebagian besar aplikasi, yang mendapatkan semua file dalam direktori biasanya tidak melihat tautan ini, setidaknya jika mereka melakukan "file ada" atau "dapat dibaca". Bahkan beberapa skrip tidak akan menemukan file di sana:
$ php -r "var_export(glob('empty/.*'));"
array (
0 => 'empty/.',
1 => 'empty/..',
)
Tetapi saya sangat menyarankan untuk menggunakan solusi ini hanya dalam keadaan khusus, tulisan yang baik README
di direktori kosong biasanya merupakan solusi yang lebih baik. (Dan saya tidak tahu apakah ini bekerja dengan sistem file windows ...)
Membaca jawaban @ofavre dan @ stanislav-bashkyrtsev menggunakan referensi submittule GIT yang rusak untuk membuat direktori GIT, saya terkejut bahwa belum ada yang menyarankan amandemen ide sederhana ini untuk membuat semuanya menjadi waras dan aman:
Daripada meretas submodule palsu ke dalam GIT , cukup tambahkan yang asli kosong .
Repositori GIT dengan tepat satu komit:
commit e84d7b81f0033399e325b8037ed2b801a5c994e0
Author: Nobody <none>
Date: Thu Jan 1 00:00:00 1970 +0000
Tidak ada pesan, tidak ada file yang berkomitmen.
Untuk menambahkan direktori kosong ke repo GIT Anda:
git submodule add https://gitlab.com/empty-repo/empty.git path/to/dir
Untuk mengonversi semua direktori kosong yang ada ke submodula:
find . -type d -empty -delete -exec git submodule add -f https://gitlab.com/empty-repo/empty.git \{\} \;
Git akan menyimpan hash komit terbaru saat membuat referensi submodule, jadi Anda tidak perlu khawatir tentang saya (atau GitLab) menggunakan ini untuk menyuntikkan file berbahaya. Sayangnya saya belum menemukan cara untuk memaksa ID komit mana yang digunakan selama checkout, jadi Anda harus memeriksa secara manual apakah ID komit referensi e84d7b81f0033399e325b8037ed2b801a5c994e0
digunakan git submodule status
setelah menambahkan repo.
Masih bukan solusi asli, tapi yang terbaik yang mungkin bisa kita miliki tanpa seseorang mendapatkan tangan mereka benar - benar kotor di basis kode GIT.
Anda harus dapat membuat ulang komit ini menggunakan (dalam direktori kosong):
# 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
Membuat komitmen GIT yang dapat direproduksi ternyata sangat sulit ...
Kamu tidak bisa Ini adalah keputusan desain yang disengaja oleh pengelola Git. Pada dasarnya, tujuan Sistem Manajemen Kode Sumber seperti Git adalah mengelola kode sumber dan direktori kosong bukan kode sumber. Git juga sering digambarkan sebagai pelacak konten, dan lagi-lagi, direktori kosong bukanlah konten (justru sebaliknya), sehingga mereka tidak dilacak.
Anda dapat menyimpan kode ini sebagai create_readme.php dan menjalankan kode PHP dari direktori root proyek Git Anda.
> php create_readme.php
Ini akan menambahkan file README ke semua direktori yang kosong sehingga direktori tersebut kemudian ditambahkan ke indeks.
<?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
}
}
?>
Lalu lakukan
git commit -m "message"
git push
checkout
dengan versi Git saat ini.