Эта проблема возникла при планировании другой системы управления Git .dotfiles
. Я хочу использовать $HOME
в качестве рабочего дерева и хранить репозиторий в другом месте (не под .git
, так как это сбивает с толку другие репозитории).
На старых машинах с ранее скопированными и потенциально измененными dotfiles теперь я хотел бы клонировать мой новый репозиторий dotfiles и (махать руками) до состояния, в котором я могу видеть (ранее) существующее состояние мои $HOME/.*
dotfiles как модификации мастера моего недавно клонированного репозитория. В основном это фон, в Git я просто хочу осторожно проверить в грязном каталоге без перезаписи.
(В обычном случае я мог бы просто начать с нового каталога, а затем скопировать свои изменения, но это кажется трудным, когда рабочее дерево — это мой $HOME
.)
Я нашел одну пару команд, которая, похоже, привела меня в нужное место, но я не уверен, есть ли в этом подходе подводные камни или более простые способы сделать то же самое:
git read-tree -v HEAD # load HEAD into the index
git checkout-index -a # cautiously check out all files without overwriting
Приходят ли эти две команды к тому же состоянию, что и копирование моего дома, выполнение обычной проверки, а затем копирование обратно моих файлов, так что git diff
будет иметь только те изменения, которые я сделал на этой машине, и никакие файлы не будут удалены?
Есть ли другие варианты, которые следует применить?
Контекст - это мой (альфа) загрузочный скрипт:
git clone --bare -n git://github.com/$(git config github.user)/.dotfiles.git ~/.dotfiles/repo.git
git config -f .dotfiles/repo.git/config core.bare false
git config -f .dotfiles/repo.git/config core.logallrefupdates true
git config -f .dotfiles/repo.git/config core.worktree $HOME
export GIT_DIR=~/.dotfiles/repo.git ; export GIT_WORK_TREE=~
git read-tree -v HEAD
git checkout-index -a # all files without overwriting
ln -sf $HOME/.dotfiles/gitignore-dots $HOME/.dotfiles/repo.git/info/exclude