Питання Як я можу додати порожню директорію в сховище Git?


Як я можу додати порожню директорію (без файлів) до сховища Git?


3477
2017-09-22 16:41


походження


Хоча це і не є корисним існує спосіб зламати порожній (дійсно порожній) каталог у ваш репо. Це не буде checkout проте з поточними версіями Git. - tiwo
@tiwo я для одного не погоджуюсь, що це не є корисним. Ваша ієрархія каталогів є частиною вашого проекту, тому її слід керувати версією. - JBentley
У моєму випадку я хотів би додати структуру каталогу для tmp-файлів, але не самих файлів tmp. Роблячи це, мій тестер має правильну структуру (інакше є помилки), але я не забиваю свої зобов'язання за допомогою даних tmp. Так, так, це мені корисно! - Adam Marshall
@AdamMarshall Я думаю, tiwo говорив, що хак не є корисним, оскільки його ігнорують перевірка. Tmp dirs звучить як корисна функція для VCS. - Quantum7
Чому не існує процедура, яка створює tmp-файли, також створюється каталог tmp? - RyPeck


Відповіді:


Інший спосіб зробити каталог залишатися порожнім (у сховищі) - це створити .gitignore файл всередині цього каталогу, який містить ці чотири рядки:

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

Тоді вам не доведеться правильно отримувати замовлення так, як вам потрібно робити в m104 рішення.

Це також дає перевагу тому, що файли в цьому каталозі не відображатимуться як "не відстежені", коли ви зробите статус git.

Виготовлення @ GreenAsJadeкоментар стійкий:

Я думаю, що варто зазначити, що це рішення робить саме те, на чому запитуване питання, але, напевно, чи не так багато людей шукатимуть на цьому питанні. Це рішення гарантує, що каталог залишається порожнім. Це говорить: "Я дійсно ніколи не хочу, щоб файли, зареєстровані тут". На відміну від "У мене немає файлів для реєстрації тут, але, але мені потрібен каталог тут, файли можуть з'являтися пізніше".


3365
2018-05-31 22:10



Я думаю, варто зазначити, що це рішення точно про що запитали, але можливо, що багато людей шукатиме це питання. Це рішення гарантує, що каталог залишається порожнім. Це говорить: "Я дійсно ніколи не хочу, щоб файли, зареєстровані тут". На відміну від "У мене немає файлів для реєстрації тут, але, але мені потрібен каталог тут, файли можуть з'являтися пізніше". - GreenAsJade
Я думаю, що рішення README, запропоноване @JohnMee, має використовуватися разом з цим; Файл .igitignore надає пояснення того, що ми хочемо відмовитися від управління версією, а файл README пояснює, що є метою каталогу, які є дуже важливими фрагментами інформації. - pedromanoel
@pedromanoel Я пишу документацію, яку ви поставили б в README всередині .gitignore файл (як коментар). - Carlos Campderrós
помітити 1 різницю: 1.) порожню папку; 2.) папку з файлом .gitignore в ньому. ;-) - Peter Perháč
Технічно це не пустий каталог ... - Arash Saidi


Ви не можете. Див Git FAQ.

В даний час розробка індексу git   (область постановки) дозволяє лише файли   бути в списку, і ніхто недостатньо компетентний   зробити зміни, щоб дозволити порожній   Довідники дуже дбали про   цю ситуацію, щоб виправити це.

Каталоги додаються автоматично   додаючи файли всередині них. Це   є, каталоги ніколи не повинні бути додані   до сховища і не відслідковуються   самостійно.

Ви можете сказати "git add <dir>" і це   додасть там файли.

Якщо вам дійсно потрібен каталог до   Існують в чеку ви повинні створити   файл у ньому .gitignore добре працює для   цієї мети; ви можете залишити це порожнім   або введіть імена файлів, які ви є   розраховувати на показ у каталозі.


983
2017-09-22 16:42



Нижче відповісти набагато краще. Той факт, що програмне забезпечення низького рівня не дає змоги, це не має значення для мене так само, як ЯКЩО насправді використовувати Gіt, коли мені потрібен пустий каталог. Додавання 2 рядка .Гітігнор для мене представляється прийнятним. - Amala
Ну, якщо потрібно перемістити файли в новий каталог, вони не зможуть це зробити git mv оскільки git скаржиться, що новий каталог не знаходиться під керуванням версії - lulalala
Ви можете читати "це неможливо, ти не можеш і т. д."по всьому Інтернету для цього часте питання .gitignore фокус - це часта відповідь і задовольняє багато потреб. Однак можливо зробити гітарний трек а справді порожній каталог див. мою відповідь - ofavre
Хоча чим більше я думаю про це, тим більше він відчуває, що "SHA хеш порожньої рядка", якщо він існує, насправді ббути чітко визначеним ідентифікатором порожнього дерева, якщо неможливо визначити, чи це об'єкт - це дерево або колір. - Emil Lundberg
Я бачив багато репо, які використовують порожній файл, який викликається .gitkeep Для цієї мети. - Sukima


Створіть порожній файл із назвою .gitkeep в каталозі, і додати це.


598
2017-12-07 16:03



+1 це комунікативне пояснення того, чому файл знаходиться там, в першу чергу - djhaskin987
Я додав відповісти заохочення створювати .keep замість цього. - A-B-B
.gitkeep не був призначений Git і збирається зробити людей другим здогадатися його значення, що приведе їх до пошуків Google, які приведуть їх тут. The .git Конфігурація префікса повинна бути зарезервована для файлів і каталогів, які використовує сам Git. - t-mart
@ t-mart " .git Префіксна конвенція повинна бути зарезервована ... "Чому? Чи бажає гіт цього бронювання? - Limited Atonement
Це не так. Справа в тому, що це може бути заплутаним. - szablica


Ви завжди можете поставити файл README у каталозі з поясненням чому ви хочете цього, в іншому випадку порожнім, каталозі в сховищі.


368
2018-03-14 23:38



+1, Хороша пропозиція, порожній каталог не має ніякого сенсу, якщо він не буде використовуватися в майбутньому. Тому створіть у ньому файл README та напишіть, який саме цей каталог, і які файли будуть розміщені там у майбутньому. Це вирішує дві проблеми. - saeedgnu
Я згоден. Порожні папки дратують і повинні бути пояснені у всіх правильно оброблених будь-яких сховищах. - Sold Out Activist
@ilius Nonsense. Структура каталогів, яка містить порожні каталоги, може бути дуже бажаною у багатьох ситуаціях (наприклад, додаток MVC, де ви хочете каталог каталогів, але ще не знайомі з створенням будь-яких моделей, або спільно використовуваних каталогів переглядів, до яких ви плануєте додавати спільні перегляди пізніше ) Крім того, введення README в кожному з них є надмірним, оскільки воно є очевидним, що вони там, і легко забути поставити README в кожному з них. І ви повинні пам'ятати, щоб видалити README, коли до них додаються інші файли. В принципі, git обов'язково повинен бути пустими каталогами. - Jez
@ Йез: я не згоден. Справа в тому, що GIT призначений для управління (та індексування) вихідного коду. Важливо, що ідентифікатор commit - це хеш вмісту. Тобто вона повинна мати вміст. Вам не потрібна README кожен частина дерева, тільки листові вузли. Якщо у вас є місця, у яких ви маєте намір поставити код, але код відсутній, і ви навіть не займете часу, щоб відлучити «місце для моделей» >> README, то те, що ви маєте, є ідеєю, а не здійсненням. Це не цікавить гіт. Говоря: "Я хочу, щоб запущений додаток мав порожні каталоги XYZ", це a runtime проблема, а не джерело проблема. Зверніться до нього з вашим інсталятором. - Joe Atzberger
@ jbo5112 Так, "спеціальний код", до якого ви посилаєтесь, - це "установник", про який я згадав. Ваша веб-програма встановлення вже має справу з створенням бази даних, локальної конфігурації, тягнучи залежності або 100 інших операцій, але пара пульових каталогів є нею? Спробуйте gradle, пасажир, шеф-кухар, примітивний Makefile та ін. Немає різниці в безпеці між створенням каталогів та іншою (потенційно набагато складнішою / небезпечнішою) роботою з встановлення додатка. І якщо у вас дійсно немає деписки, конфігурації, БД тощо, і жодного інсталятора, то просто використовуйте README. Жодна справа не вимагає від вас обох дій. - Joe Atzberger


touch .keep

У Linux це створює порожній файл з назвою .keep. Найкраще це ім'я .gitkeep оскільки перший є агностиком для Git, тоді як останній є специфічним для Git. По-друге, як зазначив інший користувач, .git Конфігурація префікса повинна бути зарезервована для файлів і каталогів, які використовує сам Git.

Як альтернатива, як зазначено в іншому відповісти, каталог може містити описову README або README.md файл замість цього.

Звичайно, це вимагає, щоб наявність файлу не призвело до зриву вашої програми.


261
2018-01-29 04:29



Це добре для початкового відкритого каталогу, але що робити, якщо він починає заповнювати файли? Тоді Git помітить їх і стверджує їх як невідслідувані файли. Вибрана відповідь тут працює набагато більш елегантно, щоб дозволити зберігати каталог, але потім безпечно ігнорувати вміст. - JakeGould
Питання та переважна загальна занепокоєння полягає в тому, щоб додати порожній каталог. Якщо пізніше він має резидентний файл, очевидно видалити його .keep файл або просто ігнорувати його. Якщо замість цього файли в каталозі повинні бути проігноровані, це інше питання взагалі. - A-B-B
Це було запропоновано, що git clean -nd | sed s/'^Would remove '// | xargs -I{} touch "{}.keep" буде робити це в усіх неявних порожніх каталогах. - A-B-B
Не подобається це рішення, важко здогадатися, що робить цей файл. Крім того, якщо ви генеруєте файли в середовищі вашого розробника (наприклад, журнали, зображення тощо), це не означає, що цей файл буде переведено на версію і не буде завантажений, що не є приємним. - danielrvt
Windows не любить файли без імен і вимагає спеціальної магії, щоб виконати це (також називається термінова програма, подібна до баш, або еквівалент). - EntangledLoops


Чому нам потрібні порожні версії папок

Насамперед:

Пустий каталог не може бути частиною дерева в системі версій Git.

Це просто не буде відслідковуватися. Але є сценарії, в яких може бути корисним "версію" порожнього каталогу, наприклад:

  • будівля a попередньо визначена структура папок для корисних папок проекту та зробити цю структуру доступною для кожного користувача / учасника сховища; або, як спеціалізований випадок вище, створення папки для тимчасові файли, наприклад a cache/ або logs/ каталоги
  • деякі проекти просто не буде працювати без деяких папок (що часто натякає на погано розроблений проект, але це часте реальний сценарій, і, можливо, це може бути, скажімо, проблеми з дозволами).

Деякі запропонували вирішення проблеми

Багато користувачів пропонують:

  1. Розміщення a README файл або інший файл з певним вмістом, щоб зробити каталог не порожнім, або
  2. Створення а .gitignore файл з певною "зворотною логікою" (тобто для включення всіх файлів), який, в кінці кінців, слугує такої ж мети підходу # 1.

Поки обидва рішення, безумовно, працюють Я вважаю їх несумісним із змістовним підходом до версії Git.

  • Чому ви, як ви вважаєте, повинні розмістити фальшиві файли чи README, які, можливо, ви не бажаєте в проекті?
  • Навіщо використовувати .gitignore робити щось (зберігання файли), що є протилежним тому, що він призначений для (виключення файли), хоча це можливо?

підхід до гри

Використовуйте a порожній файл називається .gitkeep щоб примусити присутність папки в системі версій.

Хоча це може здатися не такою великою різницею:

  • Ви використовуєте файл, у якому є сингл мета зберігання папки. Ви не розміщуєте жодної інформації, яку ви не хочете розміщувати.

    Наприклад, ви повинні використовувати README як добре, READMEs з корисною інформацією, а не як привід для збереження папки.

    Розподіл проблем завжди добре, і ви все одно можете додати .gitignore ігнорувати небажані файли.

  • Назвіть його .gitkeep робить це дуже чітко і зрозуміло з самого імені файлу (а також іншим розробникам, що добре для спільного проекту та однієї з основних цілей сховища Git), що цей файл є

    • Файл, не пов'язаний з кодом (через головну крапку та назву)
    • Файл, чітко пов'язаний з Git
    • Його мета (тримати) є чітко заявленим і послідовним і семантично протилежним за своїм значенням до ігнорувати

Прийняття

Я бачив .gitkeep підхід, прийнятий дуже важливими рамками, як Ларавел, Кутова-CLI.


204
2017-12-04 23:32



Ви пропустили одну думку - яка причина зберігання та порожньої папки (наприклад, / logs, / tmp, / uploads)? Так - це залишити папку порожньою. :) Тому, якщо ви хочете зберегти папку порожньою, вам слід ігнорувати файли всередині нього. - Roman
@Роман Аленсенштейн: не обов'язково Може бути, ви створюєте репо з певною структурою, яка може бути заповнена пізніше. Ці файли будуть додані до репо, як тільки вони будуть створені, і буде дратувати, щоб почати видаляти чи редагувати файли .igitignore (і небезпечно, тому що, напевно, ви навіть не усвідомлюєте, що вони не відслідковуються: git ігнорує їх ) - dangonfast
downvote: verbose answer. - Behnam
@Бехнам: Я візьму нижню позицію, але моє дослідження на S.O. Мета не проявляє стурбованості до докладних відповідей, якщо вони забезпечують достатню деталізацію та чіткість, щоб бути корисними для кожного читача (і для кожного рівня майстерності). Тим не менш, я дуже відкритий для будь-якої критики, і дякую, що публічно заявив причину, я дуже позитивно. - Cranio
Якщо ви редагуєте свою відповідь на зміну .gitkeep з будь-яким іншим названим файлом, не вказаним git, ви отримаєте мої відповіді, я думаю, що це одна з найкращих і найбільш інформативних відповідей. Причина. Я думаю, що ".git *" має бути зарезервовано для файлів, призначених для git, хоча це просто просто заповнювач. Перший припущення, коли я бачив це, полягає в тому, що, наприклад, файл ".gitkeep" буде автоматично ігноруватися (це буде хороша функція), але це не так, вірно? - Johnny


Як описується в інших відповідях, Gіt не може представляти пусті каталоги в області орієнтації. (Див Git FAQ.) Однак, якщо для ваших цілей каталог достатньо порожній, якщо він містить a .gitignore тільки файл, то ви можете створити .gitignore файли в порожніх каталогах лише за допомогою:

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

119
2018-05-03 15:17



Ви можете проігнорувати каталог .git: find . -name .git -prune -o -type d -empty -exec touch {}/.gitignore \; - steffen
Прості варіації для більшості ситуацій є find * -type d -empty -exec touch {}/.gitignore \; - akhan
Оскільки OS X створює файл .DS_Store практично у кожній директорії, це не працює там. Єдиний (НЕБЕЗПЕЧНИЙ!) Шлях, який я знайшов, полягав у тому, щоб спочатку видалити всі файли .DS_Store find . -name .DS_Store -exec rm {} \; і потім скористайтеся цим варіантом відповідного варіанту. Не забудьте виконати це лише в правильній папці! - zerweck
Хто-небудь знає, як зробити це в Windows з командного рядка? Я бачив деякі рішення тут у Ruby та Python, але я хотів би вирішити проблеми з баребунами, якщо це можна буде керувати. - Mig82
@akhan Додавання щось до .gitignore не має впливу на -empty прапор find команда Мій коментар щодо видалення .DS_Store файли в дереві каталогів, тож -empty прапор може бути застосований. - zerweck


Енді Лестер правильно, але якщо ваш каталог просто повинен бути порожнім, а не порожній порожній, ви можете залишити порожнім .gitignore файл там як обхідний шлях.

Крім того, це питання реалізації, а не основна проблема дизайну зберігання Git. Як вже багато разів згадувалося в списку розсилки Git, причиною того, що це не було реалізовано, полягає в тому, що ніхто не дбав про те, щоб надати патч для нього, а не те, що це не могло або не повинно бути зроблено.


57
2017-09-22 17:28



Це саме те, що я сказав. Обидва абзаци розглядаються у фрагменті часто заданих питань. - Andy Lester
Я думаю, що вбік є нетерплячим та корисним для знання - це може бути виправлено, просто не очікуйте цього в найближчому майбутньому, коли в таких випадках є така легка робота. - wnoise
На жаль, я не прочитав останній абзац, і поки я прочитав перший абзац, добре, я не знаю, чому я повторив цю інформацію. - Aristotle Pagaltzis
Звичайно, ця додаткова відповідь служить для того, щоб вказати на факт. - Michael Johnson
Я приїхав сюди, дивлячись на випадок, коли будівництво впало, якщо каталог не існує, і за замовчуванням він порожній, але він не повинен бути порожнім. Створення .gitignore робить правильну справу. - Joshua


The Ruby on Rails шлях:

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

Тепер в дереві буде включено каталог журналу. Це дуже корисно при розгортанні, тому вам не доведеться писати процедуру для створення каталогів журналу.

Файли журналів можуть бути утримані шляхом видачі,

echo log/dev.log >> .gitignore

але ви, напевно, це знали.


29
2017-10-22 13:24



Що це має відношення до Ruby on Rails? - Quolonel Questions
@ QuolonelQuestions github.com/rails/rails/blob/master/activerecord/test/migrations/... - Radon Rosborough