Как отслеживать каталоги, но не их файлы с помощью 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.


1
Хорошая статья и комментарии! Никогда не думал об использовании .gitignore в качестве файла-заполнителя ....
Питер Фармер

Благодарю. Я кое-что узнал, просто написав сообщение и получив комментарии.
Abizern

1
Похоже, сейчас есть популярное соглашение об именах.gitkeep
tarabyte 07

только что получил этот момент "ха-ха" прямо сейчас, я бы хотел проголосовать 6 разных раз
adelowo

27

Лучший ответ, который я нашел, - это включить файл .gitignore в папку загрузки с этим контентом.

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

Здесь у вас есть Как мне добавить пустой каталог в репозиторий Git?


Это самое элегантное решение
Мухаммад Райхан Мухаймин


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

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

/ ** /


Спасибо! Я использую этот способ, и он очень помогает
себасира
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.