git update-index - не змінюється в каталозі


101

git 1.7.12

Я хочу позначити всі файли нижче даної каталоги як припущенні без змін.

1) git update-index --assume-unchaged dir/дає "Ігнорування шляху".

2) git update-index --assume-unchaged dir/*швидко виходить з ладу, оскільки він зустріне файли, які не відслідковуються, отже, він дає "фатальний: Неможливо позначити файл" і закриває.

3) Спробуйте створити список файлів для позначення. cdв потрібний каталог, а потім запустіть git ls-files | tr '\n' ' ' | git update-index --assume-unchanged. Це не видає повідомлення про помилку, але воно не вдало маркує файли. Перша частина команди, git ls-files | tr '\n' ' 'правильно, створює список, обмежений пробілом, усіх файлів, які я хочу позначити. Якщо я скопіюю і вставте висновок цієї команди в командний рядок, тоді git update-indexкоманда працює. Що не працює з трубами?

Ні, мені недостатньо додати dirдо .gitignore. Мені потрібно, щоб ці файли були у сховищі, але на місцевому рівні будуть внесені небажані зміни, які потрібно ігнорувати, щоб користувачі могли робити витяги.

Відповіді:


174

git update-index хоче імена файлів у своєму командному рядку, а не на стандартному вході.

Крок 1:

cd в папку, яку ви хочете припустити, не змінюється

Крок 2:

Ви можете зробити це:

git update-index --assume-unchanged $(git ls-files | tr '\n' ' ')

або

git ls-files | tr '\n' ' ' | xargs git update-index --assume-unchanged

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

git ls-files -z | xargs -0 git update-index --assume-unchanged

Edit: вбудований вхід з @MatthewScharley щодо git ls-files -z.

Команди Windows

Примітка. Якщо ви перебуваєте у вікні, використовуйте Git Bash для запуску цих команд


2
FYI, що `| tr '\ n' '' `біт непотрібний.
Вацлав Славік

7
@twalberg: Ви можете просто скористатисяgit ls-files -z
Меттью Шарлі

2
@twalberg Як скасувати цю команду "git ls-files -z | xargs -0 git update-index --assume-unchanged"
Мохамед Хуссейн

3
@MohamedHussain git ls-files -z | xargs -0 git update-index --no-assume-unchanged, я б подумав ...
twalberg

1
git ls-files -z | git update-index -z --stdinчистіше.
Джед

22

findКоманда з GNU Findutils має -execопцію , яка видаляє більшу частину клопоту використання xargs, хоча його синтаксис трохи особливий. Однак він прекрасно справляється з назви файлів з пробілами.

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

find path/to/dir -type f -exec git update-index --assume-unchanged '{}' \;

Find бере кожен аргумент після -execдо ;( до якого вам доведеться уникнути, щоб ваша оболонка {}не з'їла його) і запускає його один раз для кожного знайденого файлу, замінюючи (знову ж таки, одиничне цитування, щоб ваша оболонка не з'їла його) на знайдене ім'я файлу.

Використовуючи findкритерії відповідності (максимальна глибина рекурсії, відповідність файлу чи каталогу, чи ім'я файлу відповідає виразу), і -execви можете робити всілякі потужні речі.

Не впевнений в інших реалізаціях findкоманди. YMMV.


2
-execє стандартним варіантом . Ви також можете -exec git update-index --assume-unchanged {} +(також визначений стандартом), який передає команду відразу декілька імен файлів, зменшуючи кількість викликів команди git.
Том Фенек

16

Додайте ім'я до каталогу .git/info/exclude. Це працює для файлів, що не відслідковуються.


Ця робота чудова! Чи знали ви, чи працює це і з файлами?
betomoretti

Але це не штовхає файли github, що не відслідковуються! чи можливий спосіб просто ігнорувати їх із записів, але насправді зберігати їх у репортажі !?
Махмуд Зальт

2

Дріж,

git update-index --assume-unchanged

працює лише з файлами, а не з каталогами. Я думаю, один із швидших способів:

cd dir
ls | xargs -l git update-index --assume-unchanged

2
Замість використання cd, ви можете передати реж як останній аргумент: git ls-files -- $DIR | xargs -l git update-index --assume-unchanged -- $DIR.
кж
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.