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

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

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

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

uploads/*.*

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

uploads/

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

Возможно ли это с помощью Git? Я искал везде, не найдя ответа.

Ответы

Ответ 1

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

upload/*

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

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

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

$ git add upload/.placeholder
The following paths are ignored by one of your .gitignore files:
upload
Use -f if you really want to add them.
fatal: no files added

Затем, когда вы выполните git status, вы увидите:

# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached ..." to unstage)
#
#   new file:   upload/.placeholder
#

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

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

Ответ 2

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

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

Ответ 4

Лучшее решение:

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

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

*
*/
!.gitignore

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

Источник: fooobar.com/questions/10447/...

Ответ 5

Чтобы отслеживать только каталоги, но не файлы, я сделал следующее. Благодаря комментарию @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 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:

Предшествующий слеш ищет только корневой каталог.

/реж

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

/**/