Как отслеживать каталоги, но не их файлы с помощью Git?

86

Я недавно начал использовать Git, и у меня проблемы только с одним. Как я могу отслеживать каталоги, не отслеживая их содержимое?

Например, сайт, над которым я работаю, позволяет загружать файлы. Я хочу отслеживать каталог загрузок, чтобы он создавался при ветвлении и т.д., но, очевидно, не файлы в нем (тестовые файлы в ветке разработки или реальные файлы в мастере).

В моем .gitignore у меня есть следующее:

загружает /*.*

Также пробовали (что игнорирует весь каталог):

загружает /

Этот каталог также может содержать подкаталоги (uploads / thumbs / uploads / videos /). Я хотел бы иметь возможность отслеживать их, но не их файлы.

Возможно ли это с Git? Я искал везде, но не нашел ответа.

Бен
источник
Git отслеживает только файлы. Что вы можете сделать, так это поиграть с хуками git и отследить файл, который будет содержать список каталогов (автоматически сгенерированный с помощью хуков). Хотя я не совсем уверен, возможно ли это.
Шимон Тот
Более конкретно: Git отслеживает содержимое и (для git) пустой каталог не является содержимым. Вы можете спорить, согласны вы или нет, но в качестве другого «обходного пути» вы можете подумать о создании каталогов при сборке / установке / по мере необходимости. Однако: я также использую « .placeholder-файл» -решение;)
KingCrunch
1
Вместо использования .placeholder я использую файл .gitignore. Это не только заботится об исключениях в каталоге, но и действует как заполнитель.
Abizern

Ответы:

114

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

upload/*

Ты можешь это сделать:

$ touch upload/.placeholder
$ git add -f upload/.placeholder

Если вы забудете, -fвы увидите:

$ git add upload / .placeholder
Следующие пути игнорируются одним из ваших файлов .gitignore:
загрузить
Используйте -f, если вы действительно хотите их добавить.
фатальный: файлы не добавлены

Тогда, когда вы это сделаете, git statusвы увидите:

# На ветке мастера
#
# Начальная фиксация
#
# Изменения, которые необходимо зафиксировать:
# (используйте "git rm --cached ..." для деактивации)
#
# новый файл: upload / .placeholder
#

Очевидно, тогда вы можете:

$ touch upload/images/.placeholder
$ git add -f upload/images/.placeholder
Питер Фармер
источник
Спасибо, это как раз то, что мне нужно.
Бен
11
Распространенным соглашением для заполнителя является файл gitignore.
Cascabel
2
@Jefromi На самом деле, как я заметил в моих комментариях к Abizern, я никогда не рассматривал возможность использования .gitignoreфайла в качестве заполнителя.
Питер Фармер
1
Упс, как-то пропустил эти комментарии.
Cascabel
3
Git не отслеживает каталоги, он отслеживает файлы - звучит забавно, когда они учат вас, что все является файлом в UNIX, даже каталог - это файл
Грин
38

Я писал об этом здесь .

Добавьте в каталог .gitignore.

Abizern
источник
1
Хорошая статья и комментарии! Никогда не думал об использовании .gitignore в качестве файла-заполнителя ....
Питер Фармер
Благодарю. Я кое-что узнал, просто написав сообщение и получив комментарии.
Abizern
1
Похоже, сейчас есть популярное соглашение об именах.gitkeep
tarabyte 07
только что получил этот момент "ха-ха" прямо сейчас, я бы хотел проголосовать 6 разных раз
adelowo
13

Лучшее решение на данный момент:

1) Создайте файл .gitignore

2) Напишите внутри:

*
*/
!.gitignore

3) Добавьте файл .gitignore в нужную папку.

Источник: https://stackoverflow.com/a/5581995/2958543

mejiamanuel57
источник
6

Чтобы отслеживать только каталоги, но не файлы, я сделал следующее. Благодаря комментарию @PeterFarmer о файлах только для отслеживания git, я смог сохранить все каталоги, за исключением файлов, как описано ниже.

# exclude everything in every folder
/data/**/*.*

# include only .gitkeep files
!/data/**/*.gitkeep

Добавление этого в файл .gitignore сделает всю работу. Ниже представлена ​​моя структура папок.

data/
├── processed
│   ├── dataset1.csv
│   └── dataset2.csv
├── raw
│   ├── raw_dataset1.json
└── test
    ├── subfolder
    │   └── dataset2.csv
    └── reviews.csv

Когда я это делаю git add . && git status, git распознает только папки, но не файлы.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   .gitignore
        new file:   data/processed/.gitkeep
        new file:   data/raw/.gitkeep
        new file:   data/test/.gitkeep
        new file:   data/test/subfolder/.gitkeep

Помните, что для ваших файлов .gitignore следующее:

Предварительная косая черта ищет только корневой каталог.

/ dir

Двойная звездочка ищет ноль или более каталогов.

/ ** /

Metinsenturk
источник
Спасибо! Я использую этот способ, и он очень помогает
себасира