Примітка: fallengamer зробив кілька тестів у 2011 році (тому вони можуть бути застарілими), і ось його висновки :
Операції
- Файл змінюється як у локальному сховищі, так і вище
git pull
:
Git все одно зберігає локальні зміни.
Таким чином, ви випадково не втратите жодних даних, які ви позначили будь-яким із прапорів.
- Файл із
assume-unchanged
прапором: Git не замінить локальний файл. Натомість це дало б конфлікти та поради, як їх вирішити
- Файл із
skip-worktree
прапором: Git не замінить локальний файл. Натомість це дало б конфлікти та поради, як їх вирішити
- Файл змінюється як у локальному сховищі, так і вище, намагаючись все-таки витягнути,
використовуючи результати в деяких додаткових ручних роботах, але принаймні ви не втратили жодних даних, якби були якісь локальні зміни.
git stash
git pull
skip-worktree
- Файл із
assume-unchanged
прапором: Відкидає всі локальні зміни без можливості відновлення. Ефект як " git reset --hard
". ' git pull
' дзвінок буде успішним
- Файл із
skip-worktree
прапором: Stash не працює над skip-worktree
файлами. " git pull
" вийде з тієї ж помилки, що і вище. Розробник змушений вручну скинути skip-worktree
прапор, щоб мати змогу зберігати та завершувати помилку pull
.
- Немає локальних змін, файл вище за течією змінено
Обидва прапори не завадять вам отримати зміни вгору. Git виявляє, що ви порушили обіцянку і вирішили відобразити реальність, скинувши прапор.
git pull
assume-unchanged
- Файл із
assume-unchanged
прапором: Вміст оновлено, прапор втрачено.
' git ls-files -v
' показує, що прапор змінено на H
(з h
).
- Файл із
skip-worktree
прапором: Вміст оновлюється, прапор зберігається.
' git ls-files -v
' буде показувати той же S
прапор, що і раніше pull
.
- При зміні локального файлу
Git не торкається
git reset --hard
skip-worktree
файлу і відображає реальність (файл, обіцяний фактично незмінним, був змінений) для assume-unchanged
файлу.
- Файл із
assume-unchanged
прапором: вміст файлу повернено. Прапор скидається доH
(з h
).
- Файл із
skip-worktree
прапором: вміст файлу недоторканий. Прапор залишається тим самим.
Він додає такий аналіз:
Схоже skip-worktree
, дуже намагаються зберегти ваші локальні дані . Але це не заважає вам отримувати зміни вгору, якщо це безпечно. Плюс git не скидає прапор pull
.
Але ігнорування команди ' reset --hard
' може стати неприємним сюрпризом для розробника.
Assume-unchanged
прапор може бути втрачений під час pull
операції, і локальні зміни в таких файлах не здаються важливими для git.
Подивитися:
Він робить висновок:
Насправді жоден з прапорів не є досить інтуїтивним .
assume-unchanged
припускає, що розробник не повинен змінювати файл. Якщо файл було змінено - то ця зміна не важлива. Цей прапор призначений для підвищення продуктивності для незмінних папок, таких як SDK.
Але якщо обіцянку порушено і файл фактично змінено, git повертає прапор, щоб відобразити реальність. Напевно, нормально мати кілька непослідовних прапорів у папках, які загалом не повинні бути змінені.
З іншого боку skip-worktree
, корисно, коли ви вказуєте git ніколи не торкатися певного файлу. Це корисно для вже відстежуваного конфігураційного файла.
У верхньому поточному сховищі розміщено деяку готову до виробництва конфігурацію, але ви хочете змінити деякі параметри в конфігурації, щоб мати можливість зробити місцеве тестування. І ви не хочете випадково перевірити, чи зміни в такому файлі впливають на конфігурацію виробництва. У цьому випадку skip-worktree
ідеальна сцена.
З Git 2.25.1 (лют. 2020 р.) "Насправді жоден із прапорів не є досить інтуїтивним", згаданий вище, уточнюється далі:
Див. Команду 7a2dc95 , здійснити 1b13e90 (22 січня 2020 р.) Від Брайана m. Карлсон ( bk2204
) .
(Об'єднав Хуніо С Хамано - gitster
- у комітеті 53a8329 , 30 січня 2020 р.)
(Список Git Mailing )
doc
: відверніть користувачів від спроби ігнорувати відстежені файли
Підписаний: Джефф Кінг
Підписався: Брайан м. Карлсон
Користувачі досить часто хочуть ігнорувати зміни у файлі, який відстежує Git.
Загальні сценарії для цього випадку - це параметри IDE та конфігураційні файли, які, як правило, не слід відслідковувати та, можливо, генерувати з відстежуваних файлів за допомогою механізму шаблонів.
Однак користувачі дізнаються про біти, що не змінюються, і пропускають робочі дерева, і намагаються використовувати їх для будь-якого.
Це проблематично, оскільки коли ці біти встановлені, багато операцій ведуть себе так, як очікує користувач, але вони зазвичай не допомагають, коли git checkout
потрібно замінити файл.
У цій справі немає розумної поведінки, оскільки іноді дані є дорогоцінними, наприклад, певні файли конфігурації, а іноді це нерелевантні дані, які користувач із задоволенням відкине.
Оскільки це не підтримується конфігурація, і користувачі схильні неправомірно використовувати існуючі функції для непередбачуваних цілей, викликаючи загальний смуток і плутанину , давайте задокументувати існуючу поведінку та підводні камені в документації, git update-index
щоб користувачі знали, що вони повинні вивчити альтернативні рішення.
Окрім цього, давайте запропонуємо рекомендоване рішення для вирішення поширених випадків файлів конфігурації, оскільки є добре відомі підходи, які успішно використовуються у багатьох середовищах.
Сторінка git update-index
man тепер включає:
Користувачі часто намагаються використовувати assume-unchanged
і skip-worktree
біти, щоб сказати Git ігнорувати зміни у файлах, які відслідковуються. Це не працює, як очікувалося, оскільки Git все ще може перевіряти робочі файли дерев на предмет індексу під час виконання певних операцій. Загалом, Git не пропонує способу ігнорувати зміни відсліджених файлів, тому рекомендуються альтернативні рішення.
Наприклад, якщо файл, який ви хочете змінити, є деяким конфігураційним файлом, сховище може включати зразок конфігураційного файла, який потім можна скопіювати в ігнороване ім’я та змінити. Репозиторій може навіть включати скрипт, який розглядає зразок-файл як шаблон, змінюючи та копіюючи його автоматично.
Останньою частиною є те, що я описую типовий драйвер фільтру вмісту на основі сценаріїв розмиття / очищення .
.gitignore
для подібних цілей. Чи допоможе це рішення вам?