Как я могу добавить пустой каталог в Git-репозиторий? - PullRequest
3815 голосов
/ 22 сентября 2008

Как добавить пустой каталог (без файлов) в репозиторий Git?

Ответы [ 28 ]

7 голосов
/ 24 декабря 2014

Вот взлом, но забавно, что он работает (Git 2.2.1). Подобно тому, что предложила @Teka, но легче запомнить:

  • Добавить подмодуль в любой репозиторий (git submodule add path_to_repo)
  • Это добавит папку и файл .submodules. Зафиксировать изменение.
  • Удалите .submodules файл и передайте изменения.

Теперь у вас есть каталог, который создается при извлечении коммита. Интересно то, что если вы посмотрите на содержимое объекта дерева этого файла, вы получите:

fatal: Недопустимое имя объекта b64338b90b4209263b50244d18278c0999867193

Я бы не советовал использовать его, поскольку он может перестать работать в будущих версиях Git. Что может привести к повреждению вашего хранилища.

7 голосов
/ 04 апреля 2011

Я всегда строю функцию для проверки желаемой структуры папок и создаю ее для меня в рамках проекта. Это решает эту проблему, поскольку пустые папки хранятся в 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, но я уверен, что большинство языков поддерживают одинаковую функциональность, и поскольку приложение заботится о создании папок, папки всегда будут там.

5 голосов
/ 11 мая 2017

Если вы хотите добавить папку, в которой будет много временных данных, в нескольких семантических каталогах, то один из подходов - добавить что-то подобное в ваш корневой каталог .gitignore ...

/app/data/**/*.* !/app/data/**/*.md

Затем вы можете фиксировать описательные файлы README.md (или пустые файлы, не имеет значения, если вы можете назначать им уникальные цели, как в этом случае *.md) в каждом каталоге, чтобы гарантировать, что все каталоги остаются часть репо, но файлы (с расширениями) игнорируются. ОГРАНИЧЕНИЕ: . не допускается в именах каталогов!

Вы можете заполнить все эти каталоги файлами xml / images или чем-либо еще и со временем добавить дополнительные каталоги в /app/data/ по мере развития хранилища для вашего приложения (с файлами README.md, предназначенными для записи в описании для чего предназначен каждый каталог хранения).

Нет необходимости дополнительно изменять .gitignore или децентрализовать, создавая новый .gitignore для каждого нового каталога. Вероятно, не самое умное решение, но оно является кратким и всегда работает на меня. Красиво и просто! ;)

enter image description here

5 голосов
/ 22 сентября 2008

Вы не можете. Это намеренное дизайнерское решение от разработчиков Git. По сути, целью системы управления исходным кодом, такой как Git, является управление исходным кодом, а пустые каталоги не являются исходным кодом. Git также часто описывается как трекер контента, и опять же, пустые каталоги не являются контентом (на самом деле наоборот), поэтому они не отслеживаются.

4 голосов
/ 02 июня 2016

Иногда вам приходится иметь дело с плохо написанными библиотеками или программным обеспечением, которому нужен «настоящий» пустой и существующий каталог. Помещение простого .gitignore или .keep может сломать их и вызвать ошибку. Следующее может помочь в этих случаях, но без гарантии ...

Сначала создайте нужный каталог:

mkdir empty

Затем вы добавляете неработающую символическую ссылку в этот каталог (но в любом другом случае, кроме описанного выше варианта использования, используйте 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 ...)

4 голосов
/ 26 мая 2016

Добавление еще одной опции в бой.

Предполагая, что вы хотите добавить каталог к ​​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 и проверьте , что in. По сути, весь файл говорит: «не игнорируйте me », но в противном случае каталог пуст и отслеживаются.

Ваш .gitignore файл будет выглядеть так:

!.gitignore

Вот и все, отметьте это, и у вас будет пустой, но отслеживаемый каталог, в котором вы сможете отслеживать файлы через некоторое время.

Причина, по которой я предлагаю оставить одну строку в файле, заключается в том, что она дает цель .gitignore. В противном случае, кто-то в будущем может подумать, чтобы удалить его. Может помочь, если вы разместите комментарий над строкой.

2 голосов
/ 11 июля 2016

Иногда у меня есть репозитории с папками, в которых когда-либо будут содержаться только файлы, которые считаются «контентом», то есть они не являются файлами, для которых мне нужна версия, и поэтому никогда не следует фиксировать. С файлом Git .gitignore вы можете игнорировать целые каталоги. Но бывают случаи, когда наличие папки в репо будет выгодным. Вот отличное решение для удовлетворения этой потребности.

В прошлом я помещал файл .gitignore в корень моего репозитория, а затем исключал папку, например:

/app/some-folder-to-exclude
/another-folder-to-exclude/*

Однако эти папки не становятся частью репо. Вы можете добавить что-то вроде файла README. Но тогда вы должны сказать своему приложению не беспокоиться об обработке каких-либо файлов README.

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

Скажите Git, что в папке есть файл, который заставляет Git добавить его в репозиторий. Скажите Git игнорировать содержимое этой папки, за исключением самого файла. Вот файл .gitignore для размещения внутри ваших пустых каталогов:

*
!.gitignore

Первая строка (*) говорит Git игнорировать все в этом каталоге. Вторая строка говорит Git не игнорировать файл .gitignore. Вы можете вставить этот файл в каждую пустую папку, которую вы хотите добавить в репозиторий.

2 голосов
/ 27 июня 2011

Вы можете сохранить этот код как 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
...