在设计另一个Git .dotfiles管理系统时,出现了这个问题。我想使用$HOME作为我的工作树,并将存储库存储在其他位置(不是在.git下,因为那会导致其他存储库混淆)。
在旧机器上,之前复制并可能调整过的dotfiles上,我现在想克隆我的新dotfiles存储库并以某种方式到达一种状态,以便我可以将$HOME/.* dotfiles的(预)现有状态视为对新克隆存储库的主分支的修改。这主要是背景,在Git中,我只想小心地检出脏目录而不覆盖。
(在普通情况下,我可以从新目录开始,然后复制我的更改,但当工作树是我的$HOME时,这似乎很难做。)
我发现了一对命令,它似乎可以让我到达正确的位置,但我不确定这种方法是否存在任何陷阱或更简单的方法来实现同样的事情:
在旧机器上,之前复制并可能调整过的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
只显示我在本机上所做的更改而不会删除任何文件?
还有其他应该应用的选项吗?
背景是我(Alpha)的引导脚本:
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
$HOME
是一个经常使用的目录,不应该成为 git 工作目录的位置;几乎可以确定工作目录会被污染。 - Zombo