Невозможно переключить ветвь после --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

У меня возникла такая же проблема, и она сводилась к тому, что меня поразили входящие изменения в файле, который я хотел принять, без изменений.

Итак, если я просто ничего не делаю без изменений, сохраняю его, проверяю последнюю версию, вытаскиваю свой кошелек и снова принимаю без изменений.

Итак, теперь я могу снова переключать ветки.