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