Коли використовувати провідну косу рису в gitignore


108

Я намагаюся зрозуміти .gitignoreсинтаксис більш чітко , зокрема, що стосується https://github.com/github/gitignore gitignores.

Я бачу, що провідна коса риса використовується для узгодження лише імен шляхів відносно місця розташування .gitignoreфайлу (від http://git-scm.com/docs/gitignore ):

Початкова косою рисою відповідає початок назви шляху. Наприклад, "/*.c" відповідає "cat-file.c", але не "mozilla-sha1 / sha1.c".

Але що відбувається, коли я видаляю провідну косу рису? Наскільки я зрозумів, є два випадки:

  1. Якщо шаблон не містить косую рису (або вона містить лише косуй косу рису, а це означає, що вона повинна відповідати каталогу), пошук проводиться у всьому дереві каталогів. Наприклад, шаблон dir/буде відповідати <root>/dir, <root>/a/dir, <root>/a/b/c/.../dirі т.д., де <root>є місце .gitignoreфайлу.
  2. Якщо візерунок містить косу рису, яка не знаходиться в кінцевому положенні (це не останній символ), то вона узгоджується лише з іменами шляхів відносно .gitignoreмісця розташування файлу.

Ось приклади, які я зробив для перевірки такої поведінки:

# Directory structure:
<root>
├─ dir/
│   └─ test
├─ src/
│   ├─ dir/
│   │   └─ test
test file is there only because Git does not track empty directories.

Перший тест:

# .gitignore
dir/

# git status
nothing to commit

Тож Git ігнорує обидва dirкаталоги. Це узгоджується з випадком № 1: у шаблону немає косої риси (крім останньої), тому Git дивиться все дерево каталогів, ігноруючи все, що відповідає шаблону.

Другий тест:

# .gitignore
/dir/

# git status
Untracked files:
    src/

Тут Git ігнорує лише dirкаталог безпосередньо під кореневим каталогом, завдяки провідній косою рисою в шаблоні.

Третій тест:

# .gitignore
dir/*

# git status
Untracked files:
    src/

Це узгоджується із випадком № 2: шаблон має деяку косу рису всередині нього, тому він розглядається як ім'я шляху, що починається з кореневого каталогу.

Тепер час для справжнього питання. Розглянемо цей файл gitignore : наприклад, коли вони ігнорують каталог downloader/, чи не насправді вони ігнорують кожен окремий downloaderкаталог, знайдений у цілому дереві каталогів? Це те, що я змушений думати, оскільки я бачив про роботу Гіта раніше.

Отже, якщо у мене трапиться спеціальний модуль із downloaderкаталогом всередині нього, чи буде він несподівано ігнорований, а також звичайний у корені Magento? Це трохи реторичне запитання, оскільки воно насправді вже трапилося зі мною, що спричинило помилку.

Так, в Magento .gitignoreфайл (який я маю в виду тільки як приклад, до речі) багато моделей містять слеш, так що вони правильно підібрані проти імен шляхів , починаючи від кореня, але є кілька випадків, як downloader/і errors/що , якщо я не помиляюся, вони є потенційно небезпечними, і їх, мабуть, слід змінити на /downloader/та /errors/.

Що стосується більш загального питання, чи повинен я завжди використовувати провідну косу рису для шаблонів, що не містять косої риси (за винятком трейлінга), коли я хочу вибрати ім'я шляху, явно починаючи з кореня, а не використовувати його для шаблонів, що містять косу рису, чи я повинен завжди використовувати провідну косу рису для наочності? Що ви думаєте про це?

Дякую за прочитання та вибачте за довгий пост.


8
Чудове запитання і справді приємне пояснення, я також переймався цим, і ваше дослідження мені зрозуміло. Прочитавши це, я б сказав, що це добра практика завжди починати шляхи з косою рисою, якщо вони починаються з кореня, це робить намір більш очевидним.
Martinsos

4
Дякую :) Я погоджуюся з вашою запискою щодо використання косої риси, щоб зробити наміри більш явними.
swahnee

8
Це має бути частиною документації .gitignore. Набагато простіше зрозуміти!
rmorrin

Я хотів би побачити, як цей чудовий пост розбився на розділи запитань та відповідей ...
Barett

Відповіді:


25

Просто хотілося підвести підсумки для можливої ​​швидкої подальшої орієнтації - провідна косою рисою прив’язує збіг до кореня. Таким чином, у наведеному нижче прикладі, без косої риси, підстановка також виключала б усе, що знаходиться в межах foo, оскільки воно займе *та рухатиметься рекурсивно вниз по дереву. Однак, з /*, він виключає все, крім foo папки та її вмісту:

$ cat .gitignore
/*
!/foo

24

Ви повністю відповіли на власне запитання. Якщо уважніше подивитися на github / gitignore repo, ви побачите, що більшість файлів використовують невідповідні правила щодо того, як записуються шаблони; цілком ймовірно, що найбільше сприяли люди, які не намагалися читати документацію і не перевіряти речі, як ви.

Тож якщо це допомагає: Ви маєте рацію, будьте впевнені.

Якщо ви бачите помилки в спільних проектах, таких як цей, не соромтеся внести свої знання. Навіть є якийсь прецедент, якщо вам потрібно ще більше розвивати свою впевненість.

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