如果'/'是存储库的根目录,为什么git会中断?

时间:2009-12-23 02:17:14

标签: git version-control configuration system

我们想使用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冲突),并且我想避免使用包装器脚本。我还有其他选择吗?

3 个答案:

答案 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变量