Bagaimana saya bisa menambahkan direktori kosong ke repositori Git?

4268

Bagaimana saya bisa menambahkan direktori kosong (yang tidak mengandung file) ke repositori Git?

Laurie Young
sumber
16
Meskipun tidak berguna, ada cara untuk meretas direktori kosong (benar-benar kosong) ke dalam repo Anda . Namun tidak checkoutdengan versi Git saat ini.
tiwo
335
@ Dua I untuk satu tidak setuju bahwa itu tidak berguna. Hirarki direktori Anda adalah bagian dari proyek Anda, sehingga harus dikontrol versi.
JBentley
114
Dalam kasus saya, saya ingin menambahkan struktur direktori untuk file tmp, tetapi bukan file tmp itu sendiri. Dengan melakukan ini, tester saya memiliki struktur yang benar (jika tidak ada kesalahan) tapi saya tidak menyumbat komitmen saya dengan data tmp. Jadi ya, ini berguna bagi saya!
Adam Marshall
45
@AdamMarshall Saya pikir tiwo mengatakan bahwa peretasan tidak berguna, karena diabaikan oleh checkout. Tmp dirs memang terdengar seperti fitur yang berguna untuk VCS.
Quantum7
31
Mengapa tidak memiliki prosedur yang membuat file tmp juga membuat direktori tmp?
RyPeck

Jawaban:

4128

Cara lain untuk membuat direktori tetap (hampir) kosong (di repositori) adalah membuat .gitignorefile 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".

Jamie Flournoy
sumber
25
Saya pikir solusi README yang diusulkan oleh @JohnMee harus digunakan bersama dengan yang ini; file .gitignore memberikan penjelasan tentang apa yang ingin kita hindari dari kontrol versi, sementara file README menjelaskan apa tujuan direktori, yang keduanya merupakan bagian informasi yang sangat penting.
pedromanoel
18
@pedromanoel Saya menulis dokumentasi yang akan Anda masukkan ke READMEdalam .gitignorefile (sebagai komentar).
Carlos Campderrós
69
temukan perbedaan 1: 1.) folder kosong, 2.) folder dengan file .gitignore di dalamnya. ;-)
Peter Perháč
6
Ini sempurna untuk folder cache .
Wangi
10
Sayangnya, ini menghasilkan direktori yang tidak kosong, ia memiliki satu file tersembunyi.
pedorro
1091

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.

Andy Lester
sumber
67
Jawaban di bawah ini JAUH lebih baik. Fakta bahwa git perangkat lunak tingkat rendah tidak memungkinkan itu tidak masalah bagi saya sebanyak BAGAIMANA benar-benar menggunakan Git ketika saya membutuhkan direktori kosong. Menambahkan 2 baris .gitignore tampaknya dapat diterima oleh saya.
Amala
1
Nah jika seseorang ingin memindahkan file ke direktori baru, mereka tidak dapat melakukannya git mvkarena git akan mengeluh bahwa direktori baru tidak berada di bawah kontrol versi
lulalala
16
Anda dapat membaca " tidak mungkin, tidak bisa, dll. " Di Internet untuk pertanyaan yang sering ini. The .gitignoretrick adalah jawaban sering, dan memenuhi banyak kebutuhan. Namun itu mungkin untuk membuat git melacak direktori yang benar - benar kosong , lihat jawaban saya
ofavre
2
Meskipun semakin saya memikirkannya, semakin rasanya "SHA hash dari string kosong", jika ada, sebenarnya akan menjadi pengidentifikasi yang terdefinisi dengan baik untuk pohon kosong, kecuali jika tidak mungkin untuk mengetahui apakah objek itu adalah pohon atau gumpalan.
Emil Lundberg
21
Saya telah melihat banyak repo yang menggunakan file kosong yang dipanggil .gitkeepuntuk tujuan ini.
Sukima
759

Buat file kosong yang disebut .gitkeepdi direktori, dan tambahkan itu.

Artur79
sumber
58
Saya telah menambahkan jawaban yang mendorong untuk membuat .keepsebagai gantinya.
Acumenus
206
.gitkeepbelum ditentukan oleh Git dan akan membuat orang lain menebak artinya, yang akan mengarahkan mereka ke pencarian google, yang akan mengarahkan mereka ke sini. The .gitkonvensi awalan harus disediakan untuk file dan direktori yang Git itu sendiri menggunakan.
t-mart
10
@ t-mart " .gitKonvensi awalan harus disediakan ..." Mengapa? Apakah git meminta reservasi ini?
Penebusan Terbatas
9
Dalam hal ini file READMEatau ABOUTakan sama baiknya atau lebih baik. Meninggalkan catatan untuk orang berikutnya, sama seperti kita semua dulu melakukannya sebelum URL.
Dave
5
Tidak berfungsi jika Anda menulis unit test yang seharusnya menguji kode pada direktori kosong ...
thebjorn
437

Anda selalu bisa meletakkan file README di direktori dengan penjelasan mengapa Anda menginginkan ini, jika tidak, direktori kosong dalam repositori.

John Mee
sumber
39
+1, Saran bagus, direktori kosong tidak masuk akal kecuali akan digunakan di masa mendatang. Jadi buat file README di dalamnya dan tuliskan untuk apa direktori ini, dan file apa yang akan diletakkan di sana di masa depan. Itu memecahkan kedua masalah.
saeedgnu
63
@ilius Nonsense. Struktur direktori yang berisi direktori kosong mungkin sangat diinginkan dalam banyak situasi (seperti aplikasi MVC di mana Anda menginginkan direktori model tetapi belum sempat membuat model apa pun, atau direktori tampilan bersama yang Anda rencanakan untuk menambahkan tampilan bersama, nanti ). Selain itu, menempatkan README di masing-masingnya adalah berlebihan karena sudah jelas untuk apa mereka di sana, dan mudah untuk melupakan menempatkan README di masing-masingnya. DAN Anda harus ingat untuk menghapus README ketika Anda menambahkan beberapa file lain ke dalamnya. Pada dasarnya, git seharusnya mengizinkan direktori kosong.
Jez
20
@ Jo: Saya tidak setuju. Intinya adalah bahwa git dirancang untuk mengontrol (dan mengindeks) kode-sumber. Yang penting, id dari commit adalah hash dari konten. Artinya, ia harus memiliki konten. Anda tidak memerlukan README di setiap bagian pohon, hanya simpul daun. Jika Anda memiliki tempat yang ingin Anda tempatkan kode, tetapi tidak ada kode, dan Anda bahkan tidak akan meluangkan waktu untuk menggemakan "tempat untuk model" >> README, maka yang Anda miliki adalah gagasan, bukan komit. Tidak menarik untuk git. Mengatakan "Saya ingin aplikasi yang berjalan memiliki direktori kosong XYZ" adalah masalah runtime , bukan masalah sumber. Tangani dengan penginstal Anda.
Joe Atzberger
6
@ JoAtzberger Ini adalah fitur yang hilang, bukan batasan yang disengaja. Dari FAQ Git: Saat ini desain indeks Git (area pementasan) hanya mengizinkan file untuk didaftar, dan tidak ada yang cukup kompeten untuk membuat perubahan untuk memungkinkan direktori kosong telah cukup peduli tentang situasi ini untuk memperbaikinya.
jbo5112
7
@ jbo5112 Ya, "kode khusus" yang Anda rujuk adalah "pemasang" yang saya sebutkan. Instalasi webapp Anda sudah harus menangani pembuatan database, konfigurasi lokal, menarik dependensi atau 100 operasi lainnya, tetapi beberapa direktori kosong ada di luarnya? Cobalah gradle, penumpang, koki, Makefile primitif, dll. Tidak ada perbedaan keamanan antara membuat direktori dan pekerjaan pemasangan aplikasi lainnya (yang berpotensi jauh lebih rumit / berbahaya). Dan jika Anda benar-benar tidak memiliki deps, config, DB, dll, dan tidak ada installer, maka cukup gunakan README. Tidak ada kasus yang mengharuskan Anda melakukan keduanya.
Joe Atzberger
349
touch .keep

Di Linux, ini membuat file kosong bernama .keep. Untuk apa nilainya, nama ini agnostik untuk Git, sedangkan .gitkeepkhusus untuk Git. Kedua, seperti yang dicatat oleh pengguna lain, .gitkonvensi awalan harus disediakan untuk file dan direktori yang digunakan Git sendiri.

Atau, seperti dicatat dalam jawaban lain , direktori dapat berisi file READMEatauREADME.md deskriptif .

Tentu saja ini mensyaratkan bahwa kehadiran file tidak akan menyebabkan aplikasi Anda rusak.

Acumenus
sumber
1
Ini bagus untuk direktori kosong awal, tetapi bagaimana jika mulai mengisi dengan file? Kemudian Git akan melihat mereka dan mengklaimnya sebagai file yang tidak terlacak. Jawaban yang dipilih di sini berfungsi jauh lebih elegan untuk memungkinkan seseorang menyimpan direktori tetapi kemudian mengabaikan isinya dengan aman.
JakeGould
14
Pertanyaan dan masalah umum yang dominan adalah tentang menambahkan direktori kosong. Jika nanti memiliki file residen, jelas hapus .keepfile atau abaikan saja. Jika alih-alih file dalam direktori diabaikan, itu adalah pertanyaan yang berbeda sama sekali.
Acumenus
3
Disarankan bahwa git clean -nd | sed s/'^Would remove '// | xargs -I{} touch "{}.keep"akan melakukan ini di semua direktori kosong yang tidak terlacak.
Acumenus
1
Tidak suka solusi ini, sulit menebak apa yang dilakukan file ini. Juga, jika Anda membuat file di lingkungan dev Anda (seperti log atau gambar, dll.), Ini tidak membuat file tersebut tidak diversi dan dibuat menjadi produksi, yang tidak baik.
danielrvt
1
Windows tidak suka file tanpa nama dan memerlukan sihir khusus untuk melakukan ini (alias aplikasi terminal mirip-bash atau setara).
EntangledLoops
303

Mengapa kita perlu folder berversi kosong

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:

  • perancah struktur folder yang telah ditentukan , membuatnya tersedia untuk setiap pengguna / kontributor repositori; atau, sebagai kasus khusus di atas, membuat folder untuk file sementara , seperti direktori cache/atau logs/, di mana kami ingin memberikan folder tetapi .gitignoreisinya
  • terkait dengan di atas, beberapa proyek tidak akan berfungsi tanpa beberapa folder (yang seringkali merupakan petunjuk dari proyek yang dirancang dengan buruk, tetapi ini adalah skenario dunia nyata yang sering terjadi dan mungkin ada, katakanlah, masalah izin yang harus ditangani).

Beberapa menyarankan solusi

Banyak pengguna menyarankan:

  1. Menempatkan READMEfile atau file lain dengan beberapa konten untuk membuat direktori tidak kosong, atau
  2. Membuat .gitignorefile 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.

  • Mengapa Anda harus meletakkan file palsu atau README yang mungkin tidak Anda inginkan dalam proyek Anda?
  • Mengapa digunakan .gitignoreuntuk melakukan sesuatu ( menyimpan file) yang sangat berlawanan dengan apa artinya ( tidak termasuk file), meskipun itu mungkin?

Pendekatan .gitkeep

Gunakan file kosong yang dipanggil .gitkeepuntuk 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 .gitignoreuntuk mengabaikan file yang tidak diinginkan.

  • Memberinya nama .gitkeepmembuatnya 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

    • File yang tidak terkait dengan kode (karena titik terkemuka dan namanya)
    • Sebuah file yang jelas terkait dengan Git
    • Tujuannya ( tetap ) secara jelas dinyatakan dan konsisten dan secara semantik menentang artinya diabaikan

Adopsi

Saya telah melihat .gitkeeppendekatan yang diadopsi oleh kerangka kerja yang sangat penting seperti Laravel , Angular-CLI .

Cranio
sumber
8
Anda melewatkan satu pemikiran - apa alasan untuk menyimpan dan mengosongkan folder (mis. / Log, / tmp, / upload)? Ya - ini untuk menjaga folder tetap kosong. :) Jadi jika Anda ingin menyimpan folder kosong, Anda harus mengabaikan file di dalamnya.
Roman
14
@ RomanAllenstein: belum tentu. Bisa jadi Anda membuat repo dengan struktur yang diberikan yang dapat dihuni kemudian. File-file itu akan ditambahkan ke repo segera setelah mereka dibuat, dan itu akan mengganggu untuk mulai menghapus atau mengedit file .gitignore (dan berbahaya, karena mungkin Anda bahkan tidak menyadari bahwa mereka tidak dilacak: git mengabaikannya )
blueFast
45
@Behnam: Saya akan mengambil downvote, tetapi penelitian saya pada meta SO tidak menunjukkan kepedulian terhadap jawaban verbal, selama mereka memberikan detail dan kejelasan yang cukup untuk berguna bagi setiap pembaca (dan setiap level keterampilan). Tetap saya sangat terbuka terhadap kritik dan terima kasih karena telah menyatakan alasannya secara terbuka, saya menerimanya dengan sangat positif.
Cranio
4
Jika Anda mengedit jawaban Anda untuk mengganti .gitkeepdengan 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?
Johnny
5
Saya bertanya-tanya mengapa orang memiliki waktu yang sulit untuk memahami mengapa orang ingin menambahkan folder "kosong" ke git. Anda harus mulai dari suatu tempat, bukan? Jadi, biasanya Anda mulai dengan struktur folder proyek Anda dan - sayangnya - pada awal proyek belum ada di sana. Setelah repo proyek Anda selesai, pekerja tim dapat mengkloning dan mulai bekerja pada struktur SAMA.
BitTickler
127

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 .gitignorefile, maka Anda dapat membuat .gitignorefile dalam direktori kosong hanya melalui:

find . -type d -empty -exec touch {}/.gitignore \;
mjs
sumber
21
Anda mungkin ingin mengabaikan direktori .git: find . -name .git -prune -o -type d -empty -exec touch {}/.gitignore \;
steffen
3
Variasi yang lebih sederhana untuk sebagian besar situasi adalahfind * -type d -empty -exec touch {}/.gitignore \;
akhan
2
Karena OS X membuat file .DS_Store di hampir setiap directoy, ini tidak berfungsi di sana. Satu-satunya solusi (BERBAHAYA!) Yang saya temukan, adalah menghapus semua file .DS_Store terlebih dahulu melalui find . -name .DS_Store -exec rm {} \;dan kemudian menggunakan varian yang disukai dari jawaban ini. Pastikan untuk hanya menjalankan ini di folder yang benar!
zerweck
1
Adakah yang tahu cara melakukan ini di Windows dari baris perintah? Saya telah melihat beberapa solusi di sini di Ruby dan Python, tetapi saya ingin solusi barebones jika dapat dikelola.
Mig82
1
@akhan Menambahkan sesuatu ke .gitignoretidak memiliki pengaruh pada -emptybendera findperintah. Komentar saya adalah tentang menghapus .DS_Storefile di pohon direktori, sehingga -emptyflag dapat diterapkan.
zerweck
68

Andy Lester benar, tetapi jika direktori Anda hanya perlu kosong, dan tidak kosong kosong, Anda dapat meletakkan .gitignorefile 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.

Aristoteles Pagaltzis
sumber
4
Itulah yang saya katakan. Kedua paragraf tersebut dibahas dalam potongan FAQ yang saya posting.
Andy Lester
1
Saya pikir selain itu tidak dapat diuji dan berguna untuk diketahui - itu bisa diperbaiki, tapi jangan berharap dalam waktu dekat ketika ada solusi yang mudah untuk kebanyakan kasus.
Berkumandang
Maaf, saya tidak membaca paragraf terakhir, dan sementara saya membaca paragraf pertama, yah, saya tidak yakin mengapa saya mengulangi informasi itu.
Aristoteles Pagaltzis
2
Tentu saja, jawaban ekstra ini berfungsi untuk menunjukkan fakta.
Michael Johnson
Saya sampai di sini melihat kasus di mana build jatuh jika direktori tidak ada dan secara default kosong, tetapi tidak perlu kosong. Membuat .gitignore melakukan hal yang benar.
Joshua
33

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.

Thomas E
sumber
23
Apa hubungannya dengan Ruby on Rails?
Pertanyaan Quolonel
30

Git tidak melacak direktori kosong. Lihat FAQ Git untuk penjelasan lebih lanjut. Solusi yang disarankan adalah meletakkan .gitignorefile 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
lesmana
sumber
28

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!

  1. Misalkan Anda berada di repositori Anda.
  2. Buat direktori kosong Anda:

    $ mkdir path/to/empty-folder
    
  3. 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).

  4. 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, cdke 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-indexmenulis ulang 040000 treebagian 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.

ofavre
sumber
Setelah meletakkan folder kosong ke dalam indeks dan melakukan, apakah mungkin untuk git svn dcommititu dengan hasil yang diinginkan?
Penebusan Terbatas
2
Tidak mungkin tweak ini akan bekerja dengan alat lain. Seperti yang dinyatakan dalam peringatan dan suntingan, saya mencegah menggunakannya kecuali dalam kasus yang sangat terbatas.
ofavre
1
Dan tentu saja ini sebabnya mengacaukan internal git dikontraindikasikan.
Casey
@abhisekp Bagaimana mungkin?
PyRulez
1
@PyRulez, dalam dunia perangkat lunak, tidak ada yang mustahil. : D Sebenarnya, saya mengikuti jawabannya.
abhisekp
21

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).

m104
sumber
11
Dua hal: Anda bisa "echo '*'> tmp / .gitignore" alih-alih menyentuh, dan "git commit -m" tidak melakukan perubahan yang dilakukan setelah Anda menambahkan file ke indeks.
Christoffer Hammarström
6
Jika Anda baru saja melakukannya, echo bla > fileAnda tidak akan mendapatkannya file: File existskarena >akan menimpa file jika sudah ada atau membuat yang baru jika tidak ada.
psyrendust
3
/bin/shasumsi budaya! * Jika "di sini" adalah cshdan variabel noclobberditetapkan, 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
clacke
1
@clacke Jika seseorang memutuskan untuk menggunakan shell yang berbeda dari orang lain, mereka harus menyatakannya secara tegas jika mereka menghadapi masalah. Berbeda dengan kebangsaan, setiap orang memiliki pilihan shell yang bebas.
SeldomNeedy
2
@ SeldomNeedy Mungkin mereka mencari bantuan karena mereka bahkan tidak tahu mereka menggunakan shell yang berbeda dari yang lainnya.
clacke
20

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
bangsawan
sumber
1
Catatan: Tautan simbolis yang saya sarankan "rusak" di checkout bersih karena .generateddirektori awalnya tidak ada. Tidak akan lagi rusak begitu Anda membangunnya.
nobar
2
Saya setuju dalam beberapa kasus ini adalah ide yang sangat bagus, tetapi dalam kasus lain (seperti mendistribusikan proyek di mana Anda memiliki kerangka kosong dengan folder seperti model / dan views /) Anda ingin pengguna memiliki direktori ini di tangan daripada daripada secara manual harus membaca membaca dokumen, dan itu bisa sedikit banyak untuk mengharapkan mereka menjalankan semacam skrip instalasi setelah kloning repo. Saya pikir jawaban ini dikombinasikan dengan jawaban README @ john-mee harus mencakup sebagian besar jika tidak semua kasus.
moopet
14

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


sumber
14

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 .gitkeepfile 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 .gitkeepfile 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.

Mig82
sumber
13

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.

user2334883
sumber
1
Saya tahu Anda memposting ini sebagai contoh argumen yang buruk, tetapi saya menghargai tautannya karena itu sebenarnya argumen yang beralasan menentang pelacakan direktori. ;-)
clacke
1
Jawaban ini tampaknya tidak konsisten, karena dalam posting berikutnya tentang utas yang dirujuk, Linus Torvald mengatakan ia berharap mereka perlu menambahkan pelacakan direktori: markmail.org/message/libip4vpvvxhyqbl . Bahkan, dia mengatakan dia "akan menyambut tambalan yang [menambah dukungan untuk melacak direktori kosong]"
Patrick M
Patrick, dia juga menggunakan kata "idiot" di sana. Saya menduga kata-katanya mendukung orang-orang di sini di utas ini dan jadi saya berasumsi dia tidak akan menerapkan sesuatu yang "bodoh" ke dalam Git sendirian.
user2334883
10

Ketika Anda menambahkan .gitignorefile, 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 .

Michael Johnson
sumber
9

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 READMEfile yang menjelaskan direktori apa yang akan digunakan.

Zaz
sumber
8

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.

Peter Hoeg
sumber
6
Saya lebih suka menggunakanfind . -type d -empty -print0 | xargs --null bash -c 'for a; do { echo "*"; echo "!.gitignore"; } >>"$a/.gitignore"; done' --
Tino
8

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, /tmpatau /cachedan folder tersebut akan tetap kosong.

Roma
sumber
2
Dia ingin menyimpan direktori kosong dan bukan file.
gvreprepins
2
Dan saya telah menyebutkan bahwa itu akan menjaga .htaccess juga. Contoh: jika perangkat lunak memiliki direktori untuk file-file log (seperti eshop oksida) yang tidak boleh diakses melalui web, ada .htaccess di direktori. Jika Anda meletakkan .gitignore yang disebutkan di atas dalam folder, .htaccess tidak akan dikomit dan folder tersebut akan dapat diakses melalui web.
Roman
Jika Anda memiliki file .htaccess yang berada di bawah kontrol versi, maka Anda sudah memiliki direktori yang memuatnya di bawah kontrol versi. Dengan demikian, masalahnya sudah terpecahkan - file .gitignore menjadi tidak relevan.
Ponkadoodle
1
@ Wallalloloo Terkait dengan pertanyaan Anda benar, namun file ini berguna, saya akan menggunakannya untuk direktori unggahan seperti itu di mana file akan dilindungi oleh .htaccess. Bertentangan dengan penjelasan Roma file .htaccess akan dikomit karena dikecualikan oleh aturan abaikan. [utas lama, saya tahu]
David
7

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.

Fuzz ringan
sumber
2
Supaya kita semua berada di halaman yang sama, saya tidak melakukan ini lagi. Buang-buang waktu. The .gitkeepkonvensi adalah praktek yang lebih baik banyak.
Mild Fuzz
Saya tidak bisa melihat bagaimana ini bisa membuang-buang waktu. Ketika TEMPLATEPATH Anda jelas dinamis, Anda tidak dapat menggunakan solusi .gitkeep. Dan bahkan dengan struktur folder nondynamic Anda harus menambahkan beberapa hal lagi daripada menghapus solusi yang sangat baik untuk memeriksa direktori misalnya memeriksa izin dan chmod file. Menambahkan cara untuk menandai direktori di dalam global .gitignore akan sempurna bagi saya. Sesuatu seperti #keep / path / to / dir
Jochen Schultz
7

Ini adalah retasan, tetapi lucu bahwa ini berhasil (Git 2.2.1). Mirip dengan apa yang disarankan @Teka, tetapi lebih mudah diingat:

  • Tambahkan submodule ke repositori apa pun ( git submodule add path_to_repo)
  • Ini akan menambah folder dan file .submodules. Lakukan perubahan.
  • Hapus .submodulesfile 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.

Stanislav Bashkyrtsev
sumber
Ini benar-benar berfungsi tetapi saya pikir membingungkan IntelliJ ...: |
rogerdpack
Saya telah membuat solusi yang lebih baik berdasarkan ini yang tidak memiliki kekurangan ini: stackoverflow.com/a/58543445/277882
ntninja
7

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}
Hainan.Z
sumber
Nice.‌‌ ༼ ͡☉ ͜ʖ ͡☉ ༽
FiringSquadWitness
6

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 *.mddalam 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 .gitignoreatau mendesentralisasi Anda dengan membuat yang baru .gitignoreuntuk setiap direktori baru. Mungkin bukan solusi paling cerdas tetapi singkat dan bijaksana selalu bekerja untuk saya. Bagus dan sederhana! ;)

masukkan deskripsi gambar di sini

ajmedway
sumber
6

Cara mudah untuk melakukan ini adalah dengan menambahkan .gitkeepfile 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.

arcseldon
sumber
4

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, .gitignoreseperti 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 .gitignorefile, dan periksa bahwa dalam. Pada dasarnya, semua file katakan adalah "jangan abaikan aku ", tetapi sebaliknya, direktori kosong dan dilacak.

.gitignoreFile 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 .gitignoretujuannya. Jika tidak, seseorang di telepon mungkin berpikir untuk menghapusnya. Mungkin membantu jika Anda memberikan komentar di atas garis.

Mike
sumber
4

Terkadang Anda harus berurusan dengan pustaka atau perangkat lunak tertulis yang buruk, yang memerlukan direktori "nyata" kosong dan sudah ada. Menempatkan yang sederhana .gitignoreatau .keepmungkin 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 READMEdengan 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 READMEdi direktori kosong biasanya merupakan solusi yang lebih baik. (Dan saya tidak tahu apakah ini bekerja dengan sistem file windows ...)

Trendfischer
sumber
4

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 .

Masukkan: https://gitlab.com/empty-repo/empty.git

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.

Pemakaian

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 e84d7b81f0033399e325b8037ed2b801a5c994e0digunakan git submodule statussetelah 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.

Lampiran: Menciptakan komit ini

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 ...

ntninja
sumber
3

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.

Jörg W Mittag
sumber
60
Saya menentang pandangan ini. Struktur adalah konten, dan semua yang Anda beri nama berkontribusi pada konten.
ThomasH
20
File kosong juga bukan kode sumber atau konten. Itu hanya sebuah nama. Namun Git akan dengan senang hati melacak file kosong. Saya tidak berpikir itu adalah keputusan desain yang disengaja untuk membuat Git menolak untuk melacak direktori kosong. Saya pikir melacak direktori kosong adalah fitur yang sama sekali tidak diperlukan 99% dari waktu, jadi mereka tidak repot-repot melakukan pekerjaan tambahan yang diperlukan untuk membuatnya berfungsi dengan baik. Git dapat melakukannya jika seseorang menginginkan fitur tersebut cukup buruk untuk mengimplementasikannya. Saya ragu para pengelola Git akan menentang tambalan seperti itu jika dilakukan dengan benar.
Dan Moulding
1
@TobyAllen di sini adalah tautan FAQ yang diperbarui . Jawaban teratas juga adalah apa yang direkomendasikan oleh FAQ dengan instruksi yang lebih tepat.
Daniel Da Cunha
3
Ini adalah fitur yang hilang (dan prioritas rendah), bukan batasan yang disengaja. Dari FAQ Git: Saat ini desain indeks Git (area pementasan) hanya mengizinkan file untuk didaftar, dan tidak ada yang cukup kompeten untuk membuat perubahan untuk memungkinkan direktori kosong telah cukup peduli tentang situasi ini untuk memperbaikinya.
jbo5112
Jangan terlalu setuju. Saya dapat menemukan berbagai alasan mengapa saya ingin melacak folder kosong. Sebagai contoh, saya sedang mengembangkan kerangka kerja MVC PHP yang sangat ringan untuk proyek-proyek saya. Saya memiliki folder khusus untuk menempatkan model, tampilan, dll. Ketika saya membuat situs baru berdasarkan kerangka kerja saya, folder itu kosong karena tidak ada model atau tampilan secara default, tetapi saya memang perlu folder itu ada, kalau tidak kerangka saya akan menang bekerja!
Gladen
2

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
pengguna665190
sumber