我们想使用git来维护系统配置。因为有时配置数据存在于/ etc之外,我们已经开始在我们的系统上做这样的事情了:
# cd /
# git init
# git add etc
# git add some/other/path
# git commit -m 'initial import'
等等。这很有效。只要你的cwd =='/',git就能正常运行。但是,例如,如果您尝试从子目录中运行git:
cd /etc
git status
你得到了垃圾。在我们的例子中,成千上万行的“已删除:”列表显然仍然存在。此行为似乎是在/中运行git所独有的。在其他地方做同样的事情就可以了。
我可以“修复”这样的行为:
GIT_WORK_TREE=/ git status
嘿,一切都按照Linus的意图行事......但这很痛苦。我不想单方面在环境中设置它(因为这会与在其他存储库中使用git冲突),并且我想避免使用包装器脚本。我还有其他选择吗?
答案 0 :(得分:4)
这是一个完整的猜测你可以用来进一步调查,但我怀疑git的“找到.git
目录”行为与/
的事实相互作用是它自己的父目录。也许“停在根”逻辑有一个fencepost类型的错误。
答案 1 :(得分:3)
在存储库中设置core.worktree
选项很好地解决了这个问题:
git config core.worktree /
这比在环境中设置GIT_WORK_TREE要好得多。耶!
答案 2 :(得分:0)
这将在Git 2.4.1 +(2015年第2季度)中修复
请commit 84ccad8查看Jeff King (peff
),并合并到7502b23。
init
:初始化core.worktree
/.git
如果您在根目录中使用“
git init /
”创建git存储库,则会错误地写入core.worktree
条目。
这不是错误的,因为在我们不需要时可以设置core.worktree
。但是,如果稍后将.git
目录移动到另一个路径(通常会移动相对工作树,但如果设置了明确的工作树,则会被挫败),这是不必要的。问题是我们通过查看是否可以通过将“/.git”连接到工作树来制作git_dir来检查core.worktree是否必要。
在这种情况下,这会导致“//.git
”,但实际上我们有“/.git
” (没有加倍的斜线)。
(这就是为什么core.worktree
在根文件夹git init
完成/
时错误设置的原因
我们可以通过特殊包装根目录来解决这个问题。我还将逻辑分解为它自己的函数,使条件更具可读性(并使用skip_prefix,我认为它使得它更加明显发生了什么)。
没有测试,因为我们需要能够写入“/”来执行此操作 我手动确认:
sudo git init /
cd /
git rev-parse --show-toplevel
git config core.worktree
仍然可以正确找到顶级(“
/
”),不会设置任何core.worktree变量。