Він реалізований зараз (git 1.9 / 2.0, Q1 2014) із магією:(exclude):! вступу pathspec магією та її короткою формою у фіксації ef79b1f та відданні 1649612 , автор
Nguyễn Thái Ngọc Duy ( pclouds) , тут можна знайти документацію .
Тепер ви можете записати все, крім вмісту підпапки:
git log -- . ":(exclude)sub"
git log -- . ":!sub"
Або ви можете виключити конкретні елементи з цієї підпапки
конкретний файл:
git log -- . ":(exclude)sub/sub/file"
git log -- . ":!sub/sub/file"
будь-який файл у межах sub:
git log -- . ":(exclude)sub/*file"
git log -- . ":!sub/*file"
git log -- . ":(exclude,glob)sub/*/file"
Ви можете зробити цей випадок відчуження нечутливим!
git log -- . ":(exclude,icase)SUB"
Як зазначив Кенні Евітт
Якщо ви працюєте з Git в оболонці Bash, використовуйте ':!sub'або ":\!sub"замість цього уникайте bash: ... event not foundпомилок
Примітка: Git 2.13 (Q2 2017) додасть синонім ^до!
Див. Комісію 859b7f1 , фіксувати 42ebeb9 (08 лютого 2017 р.) Від Лінуса Торвальда ( torvalds) .
(Об'єднав Хуніо С Хамано - gitster- у комітеті 015fba3 , 27 лютого 2017 р.)
pathspec magic: додайте " ^" як псевдонім для " !"
Вибір " !" для негативного проспекту шляху не тільки не відповідає тому, що ми робимо для редагувань, це також жахливий характер для розширення оболонки, оскільки воно потребує цитування.
Тож додайте "^ " як альтернативний псевдонім для виключення запису pathspec.
Зауважте, що до Git 2.28 (Q3 2020) використання негативного шляху проспекту під час збору шляхів, включаючи необроблені в робочому дереві, було порушено.
Див. Комісію f1f061e (05 червня 2020 р.) Від Іллі Ньюрена ( newren) .
(Об'єднав Хуніо С Хамано - gitster- у комітеті 64efa11 , 18 червня 2020 р.)
dir: виправити обробку заперечуваних перспектив
Повідомляв: Джон Міллікін
Підписався: Ілля Ньюрен
do_match_pathspec()почалося життя так, як match_pathspec_depth_1()і для правильності потрібно було лише покликатись match_pathspec_depth(). match_pathspec_depth()Пізніше було перейменовано на match_pathspec(), тому інваріант, якого ми очікуємо сьогодні, - це те, що do_match_pathspec()він не має прямих абонентів за межами match_pathspec().
На жаль, цей намір було втрачено із перейменовуванням двох функцій, і додаткові виклики do_match_pathspec()були додані до комітетів 75a6315f74 (" ls-files: додавання узгодження шляху для підмодулів", 2016-10-07, Git v2.11.0-rc0 - злиття, зазначене в batch # 11 ) та 89a1f4aaf7 (" dir: якщо наш pathspec може збігатися з файлами під dir, повторити його", 2019-09-17, Git v2.24.0-rc0).
Звичайно, do_match_pathspec()був важливий прогрес над match_pathspec()- match_pathspec()прапори жорсткого коду до одного з двох значень, і цим новим абонентам потрібно було передавати якесь інше значення для прапорів.
Крім того, хоча виклик do_match_pathspec()безпосередньо був невірним, ймовірно, не було різниці у видимому кінцевому виході, оскільки помилка просто означала, що fill_diretory()повториться в непотрібні каталоги.
Оскільки наступні перевірки відповідності цього шляху в окремих шляхах під каталогом призвели до того, що ці додаткові шляхи будуть відфільтровані, єдиною відмінністю від використання неправильної функції були непотрібні обчислення.
Другий із тих поганих дзвінків до do_match_pathspec()участі - або прямим рухом, або копіюванням + редагуванням - у низку пізніших рефакторів.
Див. Коміти 777b420347 (" dir: синхронізувати treat_leading_path()та read_directory_recursive()", 2019-12-19, Git v2.25.0-rc0 - об'єднати ), 8d92fb2927 (" dir: замінити експоненціальний алгоритм на лінійний", 2020-04-01, Git v2.27.0 -rc0 - злиття, вказане в партії №5 ), і 95c11ecc73 ("Виправити fill_directory()API, схильний до помилок ; зробити це лише поверненнями", 2020-04-01, Git v2.27.0-rc0 - злиття, вказане в партії №5 ) .
Останній із них запровадив використання do_match_pathspec()окремого файлу, і таким чином було повернуто окремі шляхи, яких не повинно бути.
Проблема з викликом do_match_pathspec()замість того match_pathspec(), що будь-які заперечувані шаблони, такі як ``:! Нежеланий_путь``, будуть ігноровані .
Додайте нову match_pathspec_with_flags()функцію для задоволення потреб у введенні спеціальних прапорів, при цьому все ще правильно перевіряючи заперечні візерунки, додайте великий коментар вище, do_match_pathspec()щоб запобігти іншим неправомірному використанню, а також виправте поточних абонентів, do_match_pathspec()щоб замість цього використовувати match_pathspec()або match_pathspec_with_flags().
Одне заключне зауваження - це те, що DO_MATCH_LEADING_PATHSPECпотребує особливої уваги при роботі DO_MATCH_EXCLUDE.
Сенс у DO_MATCH_LEADING_PATHSPECтому, що якщо ми маємо подібну перспективу
*/Makefile
і ми перевіряємо шлях до каталогу
src/module/component
що ми хочемо вважати його збігом, щоб ми рекурсували в каталог, оскільки в ньому _mightє файл, названий Makefileдесь нижче.
Однак, коли ми використовуємо схему виключення, тобто ми маємо схожу перспективу
:(exclude)*/Makefile
ми НЕ хочемо сказати, що такий шлях до каталогу
src/module/component
- це (негативна) відповідність.
Хоча десь під цим каталогом може бути файл з назвою 'Makefile', також можуть бути інші файли, і ми не можемо попередньо виключити всі файли в цьому каталозі; нам потрібно повторити і перевірити окремі файли.
Відрегулюйте DO_MATCH_LEADING_PATHSPECлогіку, щоб активуватися лише для позитивних перспектив.
!f() { git log ... | path/to/filter-log.pl "$@" | git log --stdin --no-walk; fабо навіть перегорнути цю частину конвеєра в сценарій.