Как удалить файлы локально, не передавая эти удаления в удаленный репозиторий, сохраняя при этом «чистое» рабочее дерево? - PullRequest
1 голос
/ 25 февраля 2020

Этот вопрос, по сути, противоположен этому .

Существуют определенные файлы, которые существуют по причинам на пульте команды. Они не часто меняются, но это не имеет значения: наличие их в моем локальном репозитории вызывает проблемы.

Я могу очень легко удалить эти файлы, но это означает, что мне нужно быть очень осторожным с тем, как и что я фиксирую , Переключение ветвей при изменении этих файлов может быть проблематичным, если между этими ветвями произошли изменения.

Как я могу удалить эти файлы локально, сохранить их на удаленном компьютере, создав иллюзию чистого рабочего дерева? Я хотел бы иметь возможность переключать ветки и выполнять работу (stage / unstage / discard) без присутствия этих файлов. Если они меняются в одной ветви, и я переключаюсь на эту ветку, файлы должны оставаться удаленными.

Мой лучший обходной путь на данный момент:

  1. Удалить все указанные файлы после ветвления (для всех моих веток разработчика).
  2. Commit.
  3. Работайте как обычно.
  4. Перебазируйте + отбросьте первый коммит перед открытием запроса на получение.

Шаги 1 и 2 можно выполнить с помощью крюка git, но я не потрудился настроить его.

Спасибо!


Также примечание по проблеме XY («почему вы хотите это сделать»): «правильное» решение - открыть заявку в службу поддержки вместе с командой, которая создала мою IDE, что я уже делаю. В то же время, обходной путь может также помочь ответить на этот вопрос, если он применяется в другом месте.

Я нашел две причины, чтобы спросить это:

  1. Мой коллега хочет, чтобы локальные .pyi файлы присутствовали на магистральная ветка для проекта Python 3.6. PyCharm использует эти .pyi файлы как источник правды, например: если вы добавляете функцию к файлу, вы должны добавить заглушку в связанный файл .pyi, иначе PyCharm не сможет найти или предложить новую функцию .
  2. Действия GitHub требуют фиксации всего каталога node_modules, а также файла точки входа .js при публикации ссылки в качестве версии Action. Это проблематично c с несколькими ветвями ActionScript GitHub, когда разработчик обычно запускает tsc перед фиксацией, поскольку скомпилированный .js в рабочем дереве всегда конфликтует при переключении ветвей. Спрятать - это правильный способ справиться с этим, но иногда это может быть неудобно.

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Разрядная проверка должна работать.

Включить разряженную проверку:

git config core.sparsecheckout true

Создать файл конфигурации .git/info/sparse-checkout и ввести шаблоны:

*
!path/to/file1/you/want/to/delete
!path/to/file2/you/want/to/delete
!path/to/file3/you/want/to/delete

Шаблоны означают «извлекать все (*) кроме (!) Остальных путей».

Сделать так, чтобы это работало:

git checkout

Таким образом, эти файлы не извлекаются и все то же самое для вас, если вам не нужно изменять или проверять эти файлы. В случае, если вам необходимо извлечь эти файлы, удалите или прокомментируйте пути к файлам в .git/info/sparse-checkout и оставьте только * и снова запустите git checkout, чтобы извлечь скрытые файлы.

2 голосов
/ 25 февраля 2020

Вы можете попробовать:

git update-index --assume-unchanged -- unWantedFile
rm unWantedFile
# work
# ...
# later on
git update-index --no-assume-unchanged -- unWantedFile
git restore unWantedFile

Этого должно быть достаточно для работы в рабочем дереве без этого файла, при этом сообщая Git, что файл все еще там.

Это также работает с git update-index --skip-worktree -- unWantedFile.
Я писал о разнице между двумя здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...