Git update-index - без изменений в каталоге

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. Мне нужно, чтобы эти файлы были в репозитории, но нежелательные изменения будут сделаны локально, и их нужно игнорировать, чтобы пользователи могли делать тяги.

Ответ 1

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

Редактировать: включены входные данные @MatthewScharley относительно git ls-files -z.

Команды Windows

Примечание. Если вы работаете в Windows, используйте Git Bash для запуска этих команд.

Ответ 2

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

Эта команда получит git, чтобы предположить, что все файлы внутри и под указанным каталогом не изменяются:

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

Найти принимает каждый аргумент после -exec до ; (который вам нужно убежать, если ваша оболочка не ест его) и запускает его один раз для каждого найденного файла при замене {} (опять же, одинарный кавычек, чтобы ваша оболочка выиграла 't съесть его) с найденным именем файла.

Используя критерии соответствия find (максимальная глубина рекурсии, является ли совпадение файлом или является каталогом, соответствует ли имя файла выражению) и -exec, вы можете делать всевозможные мощные вещи.

Не уверен в других реализациях команды find. YMMV.

Ответ 3

Добавьте имя каталога в .git/info/exclude. Это работает для файлов без следа.

Ответ 4

Yeap,

git update-index --assume-unchanged

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

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