Не возможно, чтобы перейти филиала после ... пропустить-worktree

ЧТО Я ХОЧУ СДЕЛАТЬ

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

ЧТО Я СДЕЛАЛ?

Чтобы достичь этого, я сделал коммит, когда файл был пуст, и толкал этот пустой файл на сервер (на GitHub). А затем заполнить файл с конфиденциальными данными и прикладной обновление-индекс git ключом --Skip-worktree путь/к/файлу` . Но я не'т сделано каких-либо совершал.

Теперь я'м пытаясь переключить мой филиал, но я'м получаю эту ошибку :

    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

Почему я использую скип-worktree вместо предположим-без изменений?

Я прочитал несколько, так что вопросы по этой теме, и нашли Borealid'ы ответ.

--предположим-без изменений предполагает, что разработчик не должен изменять файл. Этот флаг предназначен для повышения производительности для изменения папки, такие как пакеты SDK.

ключом --Skip-worktree полезно, когда вы Git не трогать конкретный файл либо потому, что разработчики должны изменить его. Например, если основной репозитория содержит некоторые готовые конфигурационные файлы и вы не хотите, чтобы случайно вносить изменения в эти файлы, ключом --Skip-worktree именно то, что вы хотите.

После этого, я нашел Джефф'ы вопрос и VonC'ы ответ. Джефф'ы проблемы практически одинаковая с моей, и я последовал за VonC'ы решение. Однако он's не работает для меня. Может быть, из-за разницы в Git версии. Так что вопрос с 2012 года. Мы говорили с VonC и велел спросить это как новый вопрос, потому что он не мог'т помню ответа.

Я пытался использовать `--предположим-без изменений " и " ключом--Skip-worktree вместе, и мягкий сброс worktree. Но ничего не изменилось.

Так?

Можете ли вы помочь мне о моей проблеме ?

Спасибо.

Комментарии к вопросу (2)

Я не'т быть в состоянии найти изящное решение для этого, так что я'м через это .файл bat бежать - не-пропустить-worktree на уязвимые файлы. Я потомзаначку, выключатель ответвления, заначка применить, а затем использовать другую.файл bat бежать `ключом--Skip-worktree на одни и те же файлы.

Это's не хорошо, но это's самый простой и быстрый способ я'вэ нашел до сих пор.

Обновление: Я'вэ снова столкнулись с этой проблемой, поэтому создал скрипт PowerShell вместо `.bat файл как указано выше. Он будет запрашивать у пользователя, хотят ли они, чтобы пропустить или не пропустить файлов. Обновление двух параметров, и вы'вновь готов пойти:

``яз-в PowerShell repoPath = то &quot [строка]$; C:\Fully\Qualified\Path" [строка[]]$filesToSkip = @( на "местных/путь/к/файлу.тхт" и, на "местных/путь/к/OtherFile.тхт"и )

$skipText = читать-хозяин -проворная 'пропустить файлы? (да/нет)' $пропустить = $skipText -как-то "Г"и компакт-диск $repoPath по каждому элементу (файл$в $filesToSkip) { если($пропустить) { Писать-хост, что "пропуск" в файл $ обновление-индекс git ключом --Skip-worktree $файл } еще { Писать-хост "Нет-пропуск" в файл $ обновление-индекс Git-не-пропустить-worktree файл $ } } ``

Комментарии (3)

Есть ли смысл иметь пустой вариант, что файл проверяется на всех? Если не

git rm --cached path/to/file
echo 'path/to/file' >> .gitignore
git commit -m'stop tracking path/to/file'

может решить вашу проблему. (Придется повторить для каждого филиала, который имеет файл. Или если вы Don'история-переписывание Т ум, использовать в Git фильтр-ветвь, чтобы избавиться от него в предыдущие коммиты.)

Комментарии (2)

Ну, это отвратительное решение, но, кажется, достаточно хорошо (хотя это только слегка проверял):

Создайте файл с именем ГИТ-checkoutsw где-то в "путь", со следующим содержанием:

#!/bin/bash
ignored=( $(git ls-files -v | grep "^S " | cut -c3-) )
for x in "${ignored[@]}"; do
  git update-index --no-skip-worktree -- "$x"
done
git checkout -m $@
for x in "${ignored[@]}"; do
  git update-index --skip-worktree -- "$x"
done

Скрипт захватывает в список игнорируемых файлов, unignores их, проверяют новые ветки с (для слияния) и все остальные параметры были указаны, а затем игнорирует их снова.

Теперь вы можете сделать checkoutsw ГИТ "вместо" Git в кассе`.

Комментарии (0)

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

Чтобы исключить файл следует поставить в разреженный-извлечение файла (см. ГИТ-читать-дерево инструкцию):

/*
!unwanted

Тогда они не будут затронуты при обновлении (так вы не'т получить содержимое из другой филиал там, вместо сохранения ваших правок). Это может быть не то, что вы хотите.

Комментарии (0)

Просто найти одну строку делать-не-пропустить-worktree на все файлы

git ls-files -v | grep "^S" | cut -c 3- | xargs -L1 git update-index --no-skip-worktree

Вы можете легко сделать немного псевдоним.unhideall с этой команды :)

Комментарии (0)

До сих пор, --предположим-без изменений и ключом --Skip-worktree не работают, как я нашел. Моя версия в git : git версии 2.8.4 (Яблоко ГИТ-73) заначка-это единственный способ, который работает до сих пор.

Комментарии (1)

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

Так что если я вобще-предположим-без изменений на файл, спрячьте его, извлечь последнюю версию, поп-мой тайник, и предположим-без изменений снова.

Так что теперь я'м возможность переключения ветвей снова.

Комментарии (0)