git предположить, что без изменений vs пропустить рабочее дерево - игнорируя символическую ссылку
У меня проблемы с git-репозиторием и windows. Проблема в том, что в репозитории git есть символьная ссылка linux, а у разработчиков, использующих windows, это явно не работает. Теперь, поскольку эта символическая ссылка никогда не должна изменяться, я хочу найти способ удалить ее на разработчиках и добавить папку на ее место (на что указывает символическая ссылка), но git игнорирует эти конкретные изменения. Теперь я могу удалить символические ссылки, создать папку с тем же именем и просто добавить.gitignore, который игнорирует все. Теперь, убедившись, что git игнорирует удаление символической ссылки, я нашел два возможных решения при исследовании. Решения, которые я нашел:
git update-index --assume-unchanged [FILE]
git update-index --skip-worktree [FILE]
У меня вопрос, какой вариант будет работать лучше? Как только я это сделаю, я хочу убедиться, что это никогда не будет отменено, если я не сделаю это специально. Я хочу убедиться, что возврат, сброс, создание веток, слияние и т. Д. Все работает нормально.
1 ответ
У обоих вариантов есть проблемы. --assume-unchanged
сбрасывает себя всякий раз, когда индекс сбрасывается (например, git reset), так что, вероятно, вы рано или поздно сбиваете с толку. То же самое касается --skip-worktree
... однако вы можете сохранить локальный список файлов, которые не нужно извлекать, чтобы бит skip-worktree устанавливался снова автоматически при необходимости. Вот шаги:
- Задавать
core.sparseCheckout
верно для хранилища. - Создать файл
.git/info/sparse-checkout
содержащий две структуры:*
включить все и!/foo
исключить символическую ссылку foo (/
означает привязку к верхнему уровню). - Теперь вручную установите бит skip-worktree, затем удалите символическую ссылку.
Теперь вы можете продолжать, не опасаясь, что git автоматически зафиксирует каталог, но учтите, что у вас все равно будут проблемы, если кто-то явно запустит git add
на каталог или любой файл в нем.
[Отредактировано, чтобы добавить:] После дальнейшего обсуждения мы нашли решение этой последней проблемы: поместите файл.gitignore с *
шаблон внутри каталога.