git update-index --assume-unchanged в каталоге

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

Ксандер Данн
источник

Ответы:

176

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 для выполнения этих команд.

Twalberg
источник
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.
kzh 03