Невозможно переключить ветвь после --skip-worktree
ЧТО Я ХОЧУ СДЕЛАТЬ
У меня есть файл, который содержит конфиденциальные данные, поэтому я не хочу выталкивать содержимое этого файла на удаленный сервер.
ЧТО Я ДЕЛАТЬ?
Чтобы добиться этого, я сделал фиксацию, когда файл был пуст, и нажал этот пустой файл на сервер (GitHub). Затем заполните файл чувствительными данными и примените git update-index --skip-worktree path/to/file
. Но я ничего не сделал.
Теперь я пытаюсь переключить свою ветку, но я получаю эту ошибку:
error: Your local changes to the following files would be overwritten by checkout:
path/to/file
Please, commit your changes or stash them before you can switch branches.
Aborting
ПОЧЕМУ Я ИСПОЛЬЗУЮТ skip-worktree
ВМЕСТО assume-unchanged
?
Я прочитал несколько SO-вопросов по этому вопросу и нашел Borealid answer.
- предполагать-неизменным предполагает, что разработчик не должен изменять файл. Этот флаг предназначен для повышения производительности для не изменяющихся папок, таких как SDK.
- skip-worktree полезна, когда вы указываете git не касаться определенного файла, потому что разработчики должны его изменить. Например, если в главном репозитории вверх по потоку хранятся некоторые готовые к конфигурации файлы конфигурации, и вы не хотите случайно вносить изменения в эти файлы, --skip-worktree - именно то, что вы хотите.
После этого я нашел вопрос Джеффа и ответ VonC. Проблема Джеффа почти такая же, как у меня, и я следил за решением VonC. Однако это не работает для меня. Возможно, из-за разницы версий git. Потому что этот вопрос с 2012 года. Мы поговорили с VonC, и он сказал, чтобы задать это как новый вопрос, потому что он не мог вспомнить ответа.
Я попытался использовать вместе --assume-unchanged
и --skip-worktree
, а также рабочую группу мягкого реселлера. Но ничего не изменилось.
SO
Можете ли вы мне помочь в моей проблеме?
Спасибо.
Ответы
Ответ 1
Мне не удалось найти оптимальное решение, поэтому я использую .bat
файл для запуска --no-skip-worktree
для затронутых файлов. Затем я stash
, ветвь switch, stash apply
, а затем используйте другой файл .bat
для запуска --skip-worktree
в тех же файлах.
Это не приятно, но это самый простой и быстрый способ, который я нашел до сих пор.
Ответ 2
Есть ли причина, по которой вообще был установлен пустой вариант этого файла? Если не
git rm --cached path/to/file
echo 'path/to/file' >> .gitignore
git commit -m'stop tracking path/to/file'
может решить вашу проблему. (Будет необходимо повторить для каждой ветки, у которой есть файл. Или если вы не возражаете против перезаписи истории, используйте git filter-branch
, чтобы избавиться от нее в предыдущих коммитах).
Ответ 3
Вы можете включить разреженную проверку и добавить файл там вместе с добавлением флага skip-worktree (если вы добавите редкую проверку, она, вероятно, будет удалена).
Чтобы исключить файл, вы должны поместить в файл разреженной проверки (см. git-read-tree):
/*
!unwanted
Тогда он не будет затронут при обновлении (так что вы не получите содержимое другой ветки, вместо этого сохраняете свои изменения). Это может быть не то, что вы хотите.
Ответ 4
До сих пор, без изменений, и -skip-worktree не работают, как я нашел. Моя версия git: git версия 2.8.4 (Apple Git -73). Единственный способ, который работает до сих пор, - это Stash.
Ответ 5
У меня возникла такая же проблема, и она сводилась к тому, что меня поразили входящие изменения в файле, который я хотел принять, без изменений.
Итак, если я просто ничего не делаю без изменений, сохраняю его, проверяю последнюю версию, вытаскиваю свой кошелек и снова принимаю без изменений.
Итак, теперь я могу снова переключать ветки.