Як відстежувати каталоги, але не їх файли за допомогою Git?


85

Нещодавно я почав використовувати Git і маю проблеми лише з одним. Як я можу відстежувати каталоги, не відстежуючи їх вміст?

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

У моєму .gitignore у мене є таке:

завантаження /*.*

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

завантаження /

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

Чи можливо це за допомогою Git? Я всюди шукав, не знайшовши відповіді.


Git відстежує лише файли. Що ви могли б зробити, це пограти з git хуками та відстежити файл, який міститиме список каталогів (автоматично згенерований за допомогою хуків). Хоча я не зовсім впевнений, чи це можливо.
Шимон Тот

Більш конкретно: Git відстежує вміст, а (для git) порожній каталог не є вмістом. Ви можете сперечатися, чи погоджуєтесь ви, чи ні, але в якості чергового «обхідного шляху» ви можете подумати про створення каталогів на build / install / коли це потрібно. Однак: я також використовую рішення " .placeholder-file";)
KingCrunch

1
Замість того, щоб використовувати .placeholder, я використовую файл .gitignore. Це не тільки дбає про виключення в каталозі, але й виконує роль заповнювача.
Abizern

Відповіді:


113

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

Дякую, це якраз те, що мені потрібно.
Ben

11
Типовою умовою для заповнювача є файл gitignore.
Cascabel

2
@Jefromi Дійсно, як мої коментарі до Abizern, ніколи не розглядав використання .gitignoreфайлу як заповнювача.
Пітер Фермер

1
На жаль, я якось пропустив ці коментарі.
Cascabel

2
Git не відстежує каталоги, він відстежує файли, звучить смішно, коли вони вчать вас, що все є файлом в UNIX, навіть каталог є файлом
Green

38

Я писав про це тут .

Додайте .gitignore в каталог.


1
Приємна маленька стаття та коментарі! Ніколи не думав використовувати .gitignore як файл заповнювача ....
Пітер Фермер

Дякую. Я чомусь навчився, просто написавши допис і отримавши коментарі.
Abizern

1
Здається, зараз використовується загальноприйнята конвенція про іменування.gitkeep
тарабайт

щойно отримав цей момент "ха-ха", я б хотів, щоб я проголосував 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 є таке:

Попередня коса риса виглядає лише для кореневого каталогу.

/ реж

Подвійна зірочка шукає нуль або більше каталогів.

/ ** /


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