Як я можу додати порожній каталог (який не містить файлів) до сховища Git?
Як я можу додати порожній каталог (який не містить файлів) до сховища Git?
Відповіді:
Інший спосіб зробити каталог (майже) порожнім (у сховищі) - це створити .gitignore
файл всередині цього каталогу, який містить ці чотири рядки:
# Ignore everything in this directory
*
# Except this file
!.gitignore
Тоді ви не повинні отримати замовлення прямо так , що ви повинні зробити в M104 ігрових рішень .
Це також дає перевагу в тому, що файли в цьому каталозі не відображатимуться як "незавершені", коли ви отримуєте статус git.
Як зробити коментар @GreenAsJade стійким:
Я думаю, що варто відзначити, що це рішення робить саме те, про що було задано питання, але це, мабуть, не те, що шукали б багато людей, які розглядали це питання. Це рішення гарантує, що каталог залишатиметься порожнім. Там написано: "Я справді ніколи не хочу, щоб файли тут були зареєстровані". На відміну від "У мене немає жодних файлів для реєстрації тут, але мені потрібен каталог, файли можуть надходити пізніше".
README
всередину .gitignore
файлу (як коментарі).
Ви не можете. Див. FAQ щодо Git .
Наразі дизайн індексу git (область постановки) дозволяє лише перелічити файли, і ніхто не достатньо компетентний вносити зміни, щоб пусті каталоги не піклувалися про цю ситуацію, щоб виправити її.
Каталоги додаються автоматично, додаючи файли всередині них. Тобто каталоги ніколи не повинні додаватися до сховища та не відслідковуються самостійно.
Ви можете сказати "
git add <dir>
", і він додасть файли туди.Якщо вам дійсно потрібен каталог для існування в касах, ви повинні створити в ньому файл. .gitignore добре працює для цієї мети; ви можете залишити його порожнім або заповнити імена файлів, які ви очікуєте відобразити в каталозі.
git mv
оскільки git поскаржиться, що новий каталог не знаходиться під контролем версій
.gitignore
Трюк є найчастішою відповіддю, і задовольняє багато потреб. Однак можна зробити git track справді порожнім каталогом, дивіться мою відповідь
.gitkeep
для цього.
Створіть порожній файл, який називається .gitkeep
в каталозі, і додайте його.
.keep
замість цього.
.gitkeep
Git не був прописаний Git і збирається змусити людей вдруге здогадуватися про його значення, що призведе їх до пошуку Google, що призведе їх сюди. .git
Префікс конвенція повинна бути зарезервована для файлів і каталогів , які сам Git використовує.
.git
Конвенція префікса повинна бути зарезервована ..." Чому? Чи git запитує це бронювання?
README
або ABOUT
файл буде таким же хорошим чи кращим. Залишаючи записку для наступного хлопця, як і ми раніше це робили перед URL-адресами.
Ви завжди можете помістити файл README у каталог із поясненням того, чому ви хочете цей, інакше порожній, каталог у сховищі.
touch .keep
У Linux це створює порожній файл з назвою .keep
. Оскільки це вартує, це ім’я є агностиком для Git, тоді як .gitkeep
буде специфічним для Git. По-друге, як зазначив інший користувач,.git
умовні префікса повинні бути зарезервовані для файлів і каталогів, якими користується сам Git.
Як варіант, як зазначено в іншій відповіді , каталог може містити описовий README
або README.md
файл .
Звичайно, це вимагає, щоб наявність файлу не призвело до розбиття вашої програми.
.keep
файл або просто проігноруйте його. Якщо ж замість цього файли в каталозі слід ігнорувати, то це зовсім інше питання.
git clean -nd | sed s/'^Would remove '// | xargs -I{} touch "{}.keep"
зробити це у всіх незавершених порожніх каталогах.
Насамперед:
Порожній каталог не може бути частиною дерева в системі версій Git .
Це просто не буде відстежено. Але є сценарії, в яких "версія" порожніх каталогів може мати значення, наприклад:
cache/
або logs/
каталоги, де ми хочемо надати папку, але.gitignore
її вмістБагато користувачів пропонують:
README
файлу чи іншого файлу з деяким вмістом для того, щоб зробити каталог не порожнім, або.gitignore
файлу з якоюсь "зворотною логікою" (тобто для включення всіх файлів), яка, врешті-решт, служить тій самій цілі підходу №1.Хоча обидва рішення безумовно працюють, я вважаю їх невідповідними змістовному підходу до версії Git.
.gitignore
для того, щоб робити щось ( зберігання файлів), що є абсолютно протилежним тому, що воно призначене ( за винятком файлів), навіть якщо це можливо?Використовуйте порожній файл під назвою.gitkeep
для того, щоб примусити присутність папки в системі версій.
Хоча це може здатися не такою великою різницею:
Ви використовуєте файл, який має сингл мету зберігати папку. Ви не поміщаєте туди жодної інформації, яку не хочете вносити.
Наприклад, ви повинні використовувати README як, ну і README з корисною інформацією, а не як привід для збереження папки.
Розділення проблем - це завжди добре, і ви можете додати додаток, .gitignore
щоб ігнорувати непотрібні файли.
Як називати це, .gitkeep
це ясно і зрозуміло з самого імені файлу (а також інших розробників , що добре для спільного проекту та однієї з основних цілей репозиторію Git), що цей файл
Я бачив .gitkeep
підхід, прийнятий в таких важливих рамках, як Laravel , Angular-CLI .
.gitkeep
будь-яке інше ім'я файлу без префіксації git, ви отримаєте мою нагоду, я вважаю, що ця відповідь є найкращою та найбільш інформативною. Причина: Я думаю, що ".git *" повинен бути зарезервований для файлів, призначених для git, хоча це лише простий заповнювач. Перший мій здогад, коли я побачив, що, наприклад, файл ".gitkeep" буде автоматично ігнорований (це було б приємною особливістю), але це не так, правда?
Як описано в інших відповідях, Git не в змозі представляти порожні каталоги в області постановки. (Див. FAQ щодо Git .) Однак, якщо для ваших цілей каталог достатньо порожній, якщо він містить лише .gitignore
файл, то ви можете створювати .gitignore
файли в порожніх каталогах лише за допомогою:
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 {} \;
а потім використати бажаний варіант з цієї відповіді. Не забудьте виконати це лише у правильній папці!
.gitignore
не впливає на -empty
прапор find
команди. Мій коментар стосується видалення .DS_Store
файлів у дереві директорій, тому -empty
прапор можна застосувати.
Енді Лестер правий, але якщо ваш каталог просто повинен бути порожнім, а не порожнім порожнім, ви можете помістити порожній .gitignore
файл туди як вирішення.
З іншого боку, це проблема впровадження, а не принципова проблема дизайну пам’яті Git. Як вже не раз згадувалося у списку розсилки Git, причиною того, що це не було здійснено, є те, що ніхто не піклується про те, щоб подати патч на нього, а не в тому, що цього не можна чи не слід робити.
Спосіб створення папки журналу Ruby on Rails :
mkdir log && touch log/.gitkeep && git add log/.gitkeep
Тепер каталог журналів буде включено до дерева. Це дуже корисно під час розгортання, тому вам не доведеться писати процедуру для створення каталогів журналів.
Журнали можна зберігати, видаючи,
echo log/dev.log >> .gitignore
але ви, мабуть, це знали.
Git не відстежує порожні каталоги. Докладніші пояснення див. У FAQ щодо Git . Запропонований спосіб вирішення полягає в тому, щоб помістити .gitignore
файл у порожній каталог. Мені не подобається таке рішення, тому що.gitignore
це "приховано" конвенцією Unix. Також немає пояснень, чому каталоги порожні.
Я пропоную помістити файл README у порожній каталог, пояснюючи, чому каталог порожній та чому його потрібно відслідковувати в Git. Якщо файл README на місці, що стосується Git, каталог більше не порожній.
Справжнє питання - навіщо вам потрібен порожній каталог в git? Зазвичай у вас є якийсь сценарій збірки, який може створити порожній каталог перед компілюванням / запуском. Якщо ні, то зробіть його. Це набагато краще рішення, ніж розміщення порожніх каталогів в git.
Отже, у вас є деякі причини, чому вам потрібен порожній каталог в git. Поставте цю причину у файлі README. Таким чином, інші розробники (і майбутні ви) знаєте, чому порожній каталог повинен бути там. Ви також будете знати, що ви можете видалити порожній каталог, коли проблема, яка потребує порожнього каталогу, вирішена.
Для переліку кожного порожнього каталогу використовуйте таку команду:
find -name .git -prune -o -type d -empty -print
Щоб створити README-заповнювачі заповнення у кожному порожньому каталозі:
find -name .git -prune -o -type d -empty -exec sh -c \
"echo this directory needs to be empty because reasons > {}/README.emptydir" \;
Щоб ігнорувати все в каталозі, крім файлу README, введіть у ваш ряд наступні рядки .gitignore
:
path/to/emptydir/*
!path/to/emptydir/README.emptydir
path/to/otheremptydir/*
!path/to/otheremptydir/README.emptydir
Крім того, ви можете просто виключити ігнорування кожного файлу README:
path/to/emptydir/*
path/to/otheremptydir/*
!README.emptydir
Щоб переглянути список README після їх створення:
find -name README.emptydir
ПОПЕРЕДЖЕННЯ: Ця настройка не справді працює, як виявляється. Вибачте за незручності.
Оригінальна публікація нижче:
Я знайшов рішення під час гри з внутрішніми Git!
Створіть порожній каталог:
$ mkdir path/to/empty-folder
Додайте його до індексу за допомогою команди сантехніки та порожнього дерева SHA-1 :
$ git update-index --index-info
040000 tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 path/to/empty-folder
Введіть команду та введіть другий рядок. Натисніть, Enterа потім Ctrl+, Dщоб припинити введення даних. Примітка: формат у режимі [SPACE] введіть шлях [SPACE] SHA-1hash [TAB] (вкладка важлива, форматування відповіді не зберігає її).
Це воно! Ваша порожня папка знаходиться у вашому індексі. Все, що вам потрібно зробити - це скористатися.
Це рішення коротке і, мабуть, працює чудово ( див. РЕДАКЦІЯ! ), Але це не так просто запам'ятати ...
Порожнє дерево SHA-1 можна знайти, створивши нове порожнє сховище Git, cd
і видавши git write-tree
, яке виводить порожнє дерево SHA-1.
Редагувати:
Я використовую це рішення з тих пір, як знайшов його. Схоже, це працює точно так само, як і створення підмодуля, за винятком того, що ніде не визначений модуль. Це призводить до помилок при видачі git submodule init|update
. Проблема полягає в тому, що git update-index
переписується 040000 tree
частина160000 commit
.
Більше того, будь-який файл, розміщений під цим контуром, ніколи не помітить Git, оскільки він вважає, що вони належать до іншого сховища. Це противно, оскільки його легко можна не помітити!
Однак якщо ви ще не (і не будете) використовувати будь-які підмодулі Git у вашому сховищі, і папка "порожня" залишиться порожньою або якщо ви хочете, щоб Git знав про її існування та ігнорував її вміст, ви можете перейти з цей твіст. Йти звичайним способом з підмодулями вживає більше кроків, які це підлаштовує.
git svn dcommit
їй отримати бажаний результат?
Скажімо, вам потрібен порожній каталог з назвою tmp :
$ mkdir tmp
$ touch tmp/.gitignore
$ git add tmp
$ echo '*' > tmp/.gitignore
$ git commit -m 'Empty directory' tmp
Іншими словами, вам потрібно додати файл .gitignore до індексу, перш ніж ви зможете сказати Git ігнорувати його (та все інше у порожньому каталозі).
echo bla > file
ви не отримаєте, file: File exists
тому що >
буде перезаписаний файл, якщо він вже є, або створити новий, якщо його не існує.
/bin/sh
культурне припущення! * Якщо "тут" csh
і змінна noclobber
встановлена, ви дійсно отримаєте file: File exists
. Якщо хтось скаже "Я це розумію", не вважайте, що вони ідіот, і відповідь "Ні, ти цього не робиш". * c2.com/cgi/wiki?AmericanCulturalAssumption
Можливо, додавання порожнього каталогу здається, що це був би шлях найменшого опору, оскільки у вас є сценарії, які очікують існування цього каталогу (можливо, тому, що він є ціллю для створених бінарних файлів). Іншим підходом буде модифікація сценаріїв для створення каталогу за потребою .
mkdir --parents .generated/bin ## create a folder for storing generated binaries
mv myprogram1 myprogram2 .generated/bin ## populate the directory as needed
У цьому прикладі ви можете перевірити (порушене) символічне посилання на каталог, щоб мати доступ до нього без префіксу ".generated" (але це необов'язково).
ln -sf .generated/bin bin
git add bin
Коли ви хочете очистити своє початкове дерево, ви можете просто:
rm -rf .generated ## this should be in a "clean" script or in a makefile
Якщо ви використовуєте часто запропонований підхід до перевірки у майже порожній папці, у вас є незначна складність видалення вмісту, не видаляючи також файл .gitignore.
Ви можете проігнорувати всі створені файли, додавши до кореня .gitignore:
.generated
.generated
каталог спочатку не існує. Він більше не буде зламаний, як тільки ви зробите свою збірку.
Я зіткнувся з проблемою і з порожніми каталогами. Проблема з використанням файлів заповнювачів полягає в тому, що вам потрібно створити їх і видалити, якщо вони більше не потрібні (адже пізніше були додані підкаталоги або файли. З великими деревами-джерелами, керування цими файлами-заповниками може бути громіздкою і помилкою схильний.
Ось чому я вирішив написати інструмент з відкритим кодом, який може керувати створенням / видаленням таких файлів-заповнювачів автоматично. Він написаний для платформи .NET і працює під Mono (.NET для Linux) та Windows.
Просто подивіться на сторінку: http://code.google.com/p/markemptydirs
Мені подобаються відповіді від @ Artur79 та @mjs, тому я використовував комбінацію обох і зробив це стандартом для наших проектів.
find . -type d -empty -exec touch {}/.gitkeep \;
Однак на Mac чи Linux працює лише декілька наших розробників. Дуже багато роботи в Windows, і я не зміг знайти еквівалентного простого однолінійного інструмента, щоб досягти того самого. Деяким пощастило встановити Cygwin з інших причин, але прописати Cygwin саме для цього здавалося непосильним.
Редагуйте для кращого рішення
Отже, оскільки у більшості наших розробників вже встановлено Ant , перше, що я подумав, - це зібрати файл збірки Ant, щоб досягти цього незалежно від платформи. Це ще можна знайти тут
Однак , пізніше я думав , що було б краще зробити це в невелику команду утиліти, так що я відтворив його з допомогою Python і опублікував його в PyPI тут . Ви можете встановити його, просто запустивши:
pip3 install gitkeep2
Це дозволить створювати та видаляти .gitkeep
файли рекурсивно, а також дозволить додавати до них повідомлення для своїх однолітків, щоб зрозуміти, чому ці каталоги важливі. Цей останній шматочок є бонусом. Я подумав, що було б непогано, якби .gitkeep
файли могли самостійно документувати.
$ 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.
Сподіваюсь, вам це стане в нагоді.
Ти не можеш і, на жаль, ніколи цього не зможеш. Це рішення, яке прийняв сам Лінус Торвальд. Він знає, що добре для нас.
Там десь я прочитав, де я читав.
Я знайшов Re: Порожні каталоги .. , але, можливо, є ще один.
Вам доведеться жити з обхідними шляхами ... на жаль.
Коли ви додаєте .gitignore
файл, якщо ви збираєтеся помістити в нього будь-яку кількість вмісту (який ви хочете, щоб Git ігнорував), ви можете додати один рядок із простою зірочкою, *
щоб переконатися, що ви не додали проігнорований вміст випадково .
Немає можливості змусити Git відслідковувати каталоги, тому єдине рішення - додати файл-заповнювач до каталогу, який потрібно відстежувати Git.
Файл може бути названий і містити все, що завгодно, але більшість людей використовують порожній файл з ім'ям .gitkeep
(хоча деякі люди вважають за краще VCS-агностик.keep
).
Префікс .
позначає його як прихований файл.
Іншою ідеєю було б додати README
файл, що пояснює, для чого буде використовуватися каталог.
Як уже згадувалося, не можна додавати порожні каталоги, але ось один вкладиш, який додає порожні файли .gitignore у всі каталоги.
ruby -e 'require "fileutils" ; Dir.glob(["target_directory","target_directory/**"]).each { |f| FileUtils.touch(File.join(f, ".gitignore")) if File.directory?(f) }'
Я встромив це в Rakefile для легкого доступу.
find . -type d -empty -print0 | xargs --null bash -c 'for a; do { echo "*"; echo "!.gitignore"; } >>"$a/.gitignore"; done' --
Рішення Джеймі Флоруного чудово працює. Ось трохи покращена версія для збереження .htaccess
:
# Ignore everything in this directory
*
# Except this file
!.gitignore
!.htaccess
За допомогою цього рішення ви можете ввести порожню папку, наприклад /log
, /tmp
або /cache
і папка буде залишатися порожньою.
Я завжди будую функцію, щоб перевірити потрібну структуру папок і побудувати її для мене в рамках проекту. Це усуває цю проблему, оскільки порожні папки зберігаються в Git за допомогою проксі.
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");
}
Це в PHP, але я впевнений, що більшість мов підтримують однаковий функціонал, і тому що про створення папок піклується додаток, папки завжди будуть там.
.gitkeep
Конвенція є набагато кращою практикою.
Ось хак, але смішно, що це працює (Git 2.2.1). Схожий на те, що запропонував @Teka, але простіше запам'ятати:
git submodule add path_to_repo
).submodules
. Внесіть зміни..submodules
файл і введіть зміни.Тепер у вас є каталог, який створюється, коли фіксація перевіряється. Цікава річ, що якщо ви подивитеся на вміст дерева-об’єкта цього файлу, ви отримаєте:
fatal: Неправильне ім'я об'єкта b64338b90b4209263b50244d18278c0999867193
Я б не рекомендував використовувати його, хоча він може припинити роботу в майбутніх версіях Git. Що може призвести до пошкодження вашого сховища.
Багато хто вже відповів на це питання. Просто додайте сюди версію PowerShell.
Знайдіть усі порожні папки в каталозі
Додати туди порожній файл .gitkeep
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}
Якщо ви хочете додати папку, яка буде містити багато перехідних даних у кількох семантичних каталогах, тоді один підхід - додати щось подібне до вашого кореневого .gitignore ...
/app/data/**/*.*
!/app/data/**/*.md
Тоді ви можете зафіксувати описові файли README.md (або порожні файли, неважливо, якщо ви можете орієнтуватися на них однозначно, як *.md
у цьому випадку) у кожному каталозі, щоб гарантувати, що всі каталоги залишаються частиною репо, а не Файли (із розширеннями) залишаються ігнорованими. ОБМЕЖЕННЯ:.
s заборонено в іменах каталогу!
Ви можете заповнити всі ці каталоги файлами xml / images або будь-яким іншим і додати більше каталогів під /app/data/
протягом часу, коли розвиваються потреби в пам’яті для вашої програми (з файлами README.md, що служать для запису опису того, для чого призначений кожен каталог зберігання точно).
Не потрібно більше змінювати .gitignore
або децентралізувати, створюючи нову .gitignore
для кожного нового каталогу. Напевно, це не найрозумніше рішення, але це дуже стильний gitignore-мудрий і завжди працює для мене. Приємно і просто! ;)
Простий спосіб зробити це - додавши .gitkeep
файл у каталог, який ви хочете (наразі) зберігати порожнім.
Дивіться цю відповідь SOF для отримання додаткової інформації - яка також пояснює, чому деякі люди вважають конкуруючу конвенцію про додавання файлу .gitignore (як зазначено у багатьох відповідях тут) заплутаною.
Додавання ще однієї опції до перемоги.
Якщо припустити, що ви хочете додати до нього каталог, git
який для всіх цілей, пов’язаних із цим git
, повинен залишатися порожнім і ніколи не буде відслідковувати його вміст, .gitignore
як це запропоновано багато разів тут, зробить свою справу.
Формат, як згадувалося, такий:
*
!.gitignore
Тепер, якщо ви хочете, як це зробити в командному рядку, одним махом, тоді як всередині каталогу, який ви хочете додати, ви можете виконати:
$ echo "*" > .gitignore && echo '!.gitignore' >> .gitignore && git add .gitignore
У мене є сценарій оболонки, який я використовую для цього. Назвіть сценарій все, що вам заманеться, або додайте його десь у ваш шлях включення, або посилайтеся на нього безпосередньо:
#!/bin/bash
dir=''
if [ "$1" != "" ]; then
dir="$1/"
fi
echo "*" > $dir.gitignore && \
echo '!.gitignore' >> $dir.gitignore && \
git add $dir.gitignore
За допомогою цього ви можете виконати його з каталогу, який ви хочете додати, або посилатися на каталог, як на перший і єдиний параметр:
$ ignore_dir ./some/directory
Ще один варіант (у відповідь на коментар @GreenAsJade), якщо ви хочете відстежувати порожню папку, яка МОЖЕ містити відслідковувані файли в майбутньому, але поки що вона буде порожньою, ви можете опустити файл *
з цього .gitignore
файлу і перевірити це . В основному, весь файл говорить: "не ігноруй мене ", але в іншому випадку каталог порожній і відслідковується.
Ваш .gitignore
файл виглядатиме так:
!.gitignore
Це все, перевірте це, і у вас є порожній, але відслідкований каталог, в який ви можете відслідковувати файли пізніше.
Причина, яку я пропоную зберегти, що один рядок у файлі полягає в тому, що він дає .gitignore
мету. В іншому випадку, хтось із ліній може подумати, щоб його видалити. Це може допомогти, якщо ви розмістите коментар над рядком.
Іноді доводиться стикатися з погано написаними бібліотеками або програмним забезпеченням, для яких потрібен "справжній" порожній і існуючий каталог. Якщо встановити простий .gitignore
або .keep
може зламати їх, це призведе до помилок. Наведене нижче може допомогти в цих випадках, але жодної гарантії ...
Спочатку створіть потрібний каталог:
mkdir empty
Тоді ви додаєте розбиту символічну посилання до цього каталогу (але в будь-якому іншому випадку, ніж описаний вище випадок використання, будь ласка, використовуйте a README
з поясненням):
ln -s .this.directory empty/.keep
Щоб ігнорувати файли в цьому каталозі, ви можете додати їх у свій корінь .gitignore
:
echo "/empty" >> .gitignore
Щоб додати ігнорований файл, використовуйте параметр, щоб примусити його:
git add -f empty/.keep
Після фіксації у вашому індексі перерване символічне посилання, а git створює каталог. Нерозривне посилання має деякі переваги, оскільки це не звичайний файл і вказує на не регулярний файл. Тож він навіть підходить до частини питання "(що не містить файлів)", не за наміром, а за значенням, я думаю:
find empty -type f
Ці команди показують порожній результат, оскільки в цьому каталозі відсутні файли. Тому більшість програм, які отримують усі файли в каталозі, зазвичай не бачать цього посилання, принаймні, якщо вони "існують", або "читається". Навіть деякі сценарії там не знайдуть жодного файлу:
$ php -r "var_export(glob('empty/.*'));"
array (
0 => 'empty/.',
1 => 'empty/..',
)
Але я настійно рекомендую використовувати це рішення лише в особливих обставинах, добре написане README
в порожньому каталозі, як правило, краще рішення. (І я не знаю, чи працює це з файловою системою Windows ...)
Читаючи відповіді @ofavre та @ stanislav-bashkyrtsev , використовуючи розбиті посилання на підмодуль GIT для створення каталогів GIT, я здивований, що ще ніхто не запропонував цієї простої поправки до ідеї, щоб зробити цю справу здоровою та безпечною:
Замість того, щоб зламати підроблений підмодуль у GIT , просто додайте порожній справжній .
Репозиторій GIT з точно одним комітом:
commit e84d7b81f0033399e325b8037ed2b801a5c994e0
Author: Nobody <none>
Date: Thu Jan 1 00:00:00 1970 +0000
Ніякого повідомлення, жодних файлів.
Щоб додати порожній каталог до GIT repo:
git submodule add https://gitlab.com/empty-repo/empty.git path/to/dir
Щоб конвертувати всі існуючі порожні каталоги в підмодулі:
find . -type d -empty -delete -exec git submodule add -f https://gitlab.com/empty-repo/empty.git \{\} \;
Git зберігатиме останній хеш-коміт при створенні посилання на підмодуль, тому вам не доведеться турбуватися про мене (або GitLab), використовуючи це для введення шкідливих файлів. На жаль, я не знайшов жодного способу примусити, який ідентифікатор комісії використовується під час оформлення замовлення, тому вам доведеться вручну перевірити, чи використовується контрольний ідентифікатор e84d7b81f0033399e325b8037ed2b801a5c994e0
комісіїgit submodule status
після додавання репо.
Тим НЕ менше не є рідною рішенням, але краще , що ми , ймовірно , може бути без кого - то отримувати їх руки на самому ділі , на самому ділі брудно в кодової GIT.
Ви повинні мати можливість відтворити цю точну фіксацію за допомогою (у порожньому каталозі):
# 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
Створення відтворюваних GIT-комісій напрочуд важко ...
Ви не можете. Це навмисне дизайнерське рішення з боку технічних працівників Git. В основному, метою системи управління вихідним кодом, як Git, є управління вихідним кодом, а порожні каталоги не є вихідним кодом. Git також часто описується як контент-трекер, і знову ж таки, порожні каталоги не є вмістом (насправді навпаки), тому вони не відслідковуються.
Ви можете зберегти цей код як create_readme.php та запустити PHP- код із кореневого каталогу вашого Git-проекту.
> php create_readme.php
Він додасть файли README до всіх порожніх каталогів, щоб ці каталоги були додані до індексу.
<?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
}
}
?>
Тоді робіть
git commit -m "message"
git push
checkout
Однак це не буде з поточними версіями Git.