git update-index --assume-неизменный в каталоге

Мерзавец 1.7.12

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

1) git update-index --assume-unchaged dir/ дает "Игнорирование пути".

2) git update-index --assume-unchaged dir/* быстро терпит неудачу, потому что он встретит файлы, которые не отслеживаются, следовательно, он выдает "fatal: Unable to mark file" и завершает работу.

3) Попробуйте создать список файлов для отметки. cd в нужный каталог, а затем запустите git ls-files | tr '\n' ' ' | git update-index --assume-unchanged, Это не выдает сообщение об ошибке, но это не успешно помечает файлы. Первая часть команды, git ls-files | tr '\n' ' ', правильно создает разделенный пробелами список всех файлов, которые я хочу отметить. Если я скопирую и вставлю вывод этой команды в командную строку, то git update-index команда работает. Что не работает с трубами?

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

4 ответа

Решение

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 для запуска этих команд.

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

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

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

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

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

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

Не уверен насчет других реализаций find команда. YMMV.

Yeap,

git update-index --assume-unchanged

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

cd dir
ls | xargs -l git update-index --assume-unchanged
Другие вопросы по тегам