Скасувати git update-index --assume-unchanged <file>


462

Те, як ви Git ігнорує перегляд / відстеження певного режиму / файлу. Ви просто запускаєте це:

git update-index --assume-unchanged <file>

Тепер, як ви скасуєте це, щоб їх знову спостерігали? (Назвемо це неприпустимо.)


5
Лише зауваження, щоб сказати, що, здається, що пропустити робоче дерево є, швидше за все, тим, що вам було б краще використовувати, ніж припускати без змін, якщо тільки виконання git не є вашою проблемою. stackoverflow.com/questions/13630849 / ...
GreenAsJade

Відповіді:


587

Щоб скасувати / показати dir's / файли, встановлені на припущення без змін, запустіть це :

git update-index --no-assume-unchanged <file>

Щоб отримати список файлів dir / файлів, які assume-unchangedвиконуються таким чином :

git ls-files -v|grep '^h'


7
Незначне вдосконалення вашої операції grep, воно може використовувати '^ [az]' для лову всіх ігнорованих файлів, оскільки перший тег літер може бути іншими літерами, ніж 'H' / 'h'. З git-scm.com/docs/git-ls-files : Цей параметр ідентифікує статус файлу з такими тегами (з наступним пробілом) на початку кожного рядка: H :: кешований S :: skip-worktree M: : незатоплений R :: вилучений / видалений C :: модифікований / змінений K :: бути вбитим? :: інше
Bdoserror

8
Ще одна корисна хитрість git ls-files -v|grep '^h'|cut -c3-, яка дасть вам лише імена файлів, без префіксу "h".
Ретсам

9
Якщо ви вже не знаєте файлів, які ви самі assume-unchanged, просто використовуйте git update-index --really-refresh. За допомогою цієї команди вам не потрібно спочатку шукати файли git ls-files.
theDmi

102

Якщо це команда, якою ви часто користуєтесь - можливо, ви також можете розглянути можливість створення псевдоніма для неї. Додати у свій глобальний .gitconfig:

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged

Як встановити псевдонім (якщо ви ще не знаєте):

git config --configLocation alias.aliasName 'command --options'

Приклад:

git config --global alias.hide 'update-index --assume-unchanged'
git config... etc

Збереживши це у своєму .gitconfig, ви можете запустити чистішу команду.

git hide myfile.ext

або

git unhide myfile.ext

Ця документація про git була дуже корисною.

Відповідно до коментарів, це також корисний псевдонім, щоб дізнатися, які файли зараз приховано:

[alias]
    hidden = ! git ls-files -v | grep '^h' | cut -c3-

2
Цей псевдонім також корисний:hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf

42

Функція git update-index має кілька варіантів, які ви можете знайти вводивши нижче:

git update-index --help

Тут ви знайдете різні варіанти - як поводитися з функцією update-index.

[якщо ви не знаєте ім'я файлу]

git update-index --really-refresh 

[якщо ви знаєте ім'я файлу]

git update-index --no-assume-unchanged <file>

поверне всі файли, додані до списку ігнорування.

git update-index --assume-unchanged <file>

git update-index - по-справжньому, оновіть, скасуйте всі припущення-без змін, які я зробив, спасибі за підказку
Sérgio

git update-index --no-assume-unchanged <file>врятувало моє життя .. Ок, я міг би просто синхронізувати папку ще раз, але я хотів "справжнього" рішення цієї проблеми.
Cagatay Ulubay

38

Я припускаю, що ви мали на увазі --assume-unchanged, оскільки я не бачу жодного --assume-changedваріанту. Зворотним --assume-unchangedє --no-assume-unchanged.


32

Щоб синтезувати чудові оригінальні відповіді від @adardesign, @adswebwork та @AnkitVishwakarma, а також коментарі від @Bdoserror, @Retsam, @seanf та @torek, з додатковими посиланнями на документацію та стислими псевдонімами ...

Основні команди

Щоб скинути файл, який вважається незмінним, повернеться до нормального:

git update-index --no-assume-unchanged <file>

Щоб перелічити всі файли, які припускаються без змін:

git ls-files -v | grep '^[a-z]' | cut -c3-

Щоб скинути всі припущені файли, що не змінюються, до нормального:

git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --

Примітка. Ця команда, яка була перерахована в іншому місці, більше не видаляє всі файли, що не змінюються припущеннями (я вважаю, що раніше і перераховувала їх як рішення):

git update-index --really-refresh

Ярлики

Щоб зробити ці загальні завдання легко виконати в git, додайте / оновіть наступний розділ псевдоніму.gitconfig для свого користувача (наприклад, ~/.gitconfigу системі * nix або macOS):

[alias]
    hide = update-index --assume-unchanged
    unhide = update-index --no-assume-unchanged
    unhide-all = ! git ls-files -v | grep '^[a-z]' | cut -c3- | xargs git update-index --no-assume-unchanged --
    hidden = ! git ls-files -v | grep '^[a-z]' | cut -c3-

1
Тому що git hiddenви можете досягти такого ж ефекту без псевдонімів або сценаріїв, використовуючи !так:hidden = ! git ls-files -v | grep '^h' | cut -c3-
seanf

1
--really-refreshне видаляє (або більше не робить, можливо, колись) очищати прапорці без змін у індексних файлах.
Торека

Дякую, @torek! Я підтвердив описану вами поведінку, і я оновив відповідь іншим рішенням справи "скинути все".
Буде Каїн

20

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

git ls-files -v | grep '^[a-z]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged
  1. git ls-files -v буде надрукувати всі файли з їх статусом
  2. grep '^[a-z]' фільтрує файли та вибирає лише припущення без змін
  3. cut -c 3- видалить статус і залишить лише контури, перерізаючи з третього символу до кінця
  4. tr '\012' '\000' замінить символ кінця рядка (\ 012) на нульовий символ (\ 000)
  5. xargs -0 git update-index --no-assume-unchangedпередасть усі шляхи, розділені нульовим символом, git update-index --no-assume-unchangedдо скасування

Це так корисно. Дякуємо за детальну інформацію!
Chamithra Thenuwara

11

Додавши до @adardesignвідповіді, якщо ви хочете скинути всі файли, які були додані до assume-unchangedсписку no-assume-unchangedза один раз, ви можете зробити наступне:

git ls-files -v | grep '^h' | sed 's/^..//' | sed 's/\ /\\ /g' | xargs -I FILE git update-index --no-assume-unchanged FILE || true

Це просто викреслить два символи, що виводяться з grep, тобто "h "вилучить будь-які пробіли, які можуть бути присутніми в іменах файлів, і, нарешті, || trueне дозволить команді достроково припинятися, якщо деякі файли в циклі мають помилки.


4

Якщо ви використовуєте розширення Git , виконайте наведені нижче дії:

  1. Перейти до вікна фіксації.
  2. Клацніть на спадному меню з назвою Зміни робочого каталогу .
  3. Виберіть опцію Показати параметр припущених змін без змін .
  4. Клацніть правою кнопкою миші на файл, який ви хочете скасувати.
  5. Виберіть Не припускати без змін .

Ви закінчили.


0

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

git update-index --assume-unchanged `git status | grep modified | sed 's|modified:||g'| xargs`

Сподіваюся, що хтось ще вважатиме це корисним.


Я думаю, ви б отримали користь від .gitignoreігнорування своїх артефактів побудови.
Нік

1
У мене є, .gitignoreале це часом, на мій досвід недостатньо. Але я розумію, в якому контексті ви це говорите.
Тяги Akhilesh

0

Жодне з рішень не працювало для мене в Windows - воно, здається, використовує капітал, Hа не hдля статусу файлу, а команда grep вимагає додаткової карети, оскільки це ^також представляє початок рядка, а також заперечення наступного символу.

Рішення для Windows

  1. Відкрийте Git Bash та перейдіть до відповідної директорії верхнього рівня.
  2. git ls-files -v | grep '^^H' щоб перелічити всі файли без кешування
  3. git ls-files -v | grep '^^H' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-skip-worktree щоб скасувати пропуск файлів, пропускаючи всі файли через update-index --skip-worktree
  4. git ls-files -v | grep '^^H]' | cut -c 3- | tr '\012' '\000' | xargs -0 git update-index --no-assume-unchanged щоб скасувати пропуск файлів, пропускаючи всі файли через update-index --assume-unchanged
  5. git ls-files -v | grep '^^H' щоб знову перерахувати всі кешовані файли та перевірити, чи працювали вищезазначені команди - тепер це нічого не повинно повернути

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