我可以为几个目录创建git存储库吗?除了根目录`/`之外,这些目录不一定共享祖先目录?

时间:2019-01-07 16:08:21

标签: git

要将任何目录转换为Git存储库,我们运行:

$ git init
Initialized empty Git repository in .git/

这是否意味着仅为单个目录创建了git存储库?

我可以为根目录/之外的多个不必共享祖先目录的目录创建git存储库吗?例如,我们可以为~/dir1/dir2/dir3~/dir4/dir5创建存储库吗?我们可以为~/dir1/dir2/dir3/dir4/dir5创建存储库吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

不。或严格来说,一个git存储库维护着一个目录树,因此它不能有多个“根目录”。

您有很多解决方案,但是所有这些都打破了拥有一个存储库的想法。例如,

  • 您可以将安装(Linux)或硬链接(macOS)的不同目录绑定到一个存储库的子目录中,尽管它们属于同一目录树,但它们仍位于不同的文件夹中
  • 您可以在这些文件夹中创建单个存储库,并将它们变成一个存储库的子模块
  • 您可以将/变成存储库,并根据需要忽略所有内容

但是,最后,为什么要将文件放到同一存储库中,同时又将它们放在不同的位置?

答案 1 :(得分:1)

是的,您只需要告诉Git您正在做什么,这与通常的设置不同,您已经提供了不寻常的位,但是很简单。

Git不需要将存储库或其工作树放在任何地方。如果您没有明确告诉它,它有一种通常的查找方法,但是您说您想要主目录的这两个子目录的历史记录。对于一次性,通常使用命令选项将Git指向零件比较容易,当您做很多事情时,可以轻松地将Git覆盖进来。所以:

myrepo=~/d123-d45-archive
git init --bare "$myrepo"

GIT_WORK_TREE=~ git -C "$myrepo" add   dir1/dir2/dir3   dir4/dir5

GIT_WORK_TREE=~ git -C "$myrepo" commit -m 'Initial commit of dir1/dir2/dir3 and dir4/dir5'

现在:在该裸仓库外没有任何迹象表明Git跟踪了您主目录中某些内容的数据,因此,当您要使用它时,必须告诉Git块在哪里。相当于上面的GIT_WORK_TREE的参数是--work-tree ~,相当于-C "$myrepo"的环境是GIT_DIR=$myrepo,如果要对它们进行批处理,例如

( export GIT_DIR=$myrepo GIT_WORK_TREE=~
  git add  dir1/dir2/dir3  dir4/dir5
  git commit -m 'new snapshot'
)

有很多方法可以使这个变得方便,您可以添加一个git别名来自动使用该对

git config --global alias.homedir \!'git -C ~/d123-d45-archive --work-tree ~'

,然后您可以git homedir diff。要设置存储库以使自反git add .不会自动添加所有内容,最简单的方法是

mkdir info
printf >info/exclude %s\\n '*' '!*/' '!dir1/dir2/dir3/**' '!dir4/dir5/**'
该回购中的

。您可以有多个存储库以这种方式跟踪任何树的不同甚至重叠部分,这意味着您可以自己跟踪所有部分,要小心一点。

请注意,像这样将Git明确指向上下文会绕过其所有合理上下文检查,Git通常只会对文件系统进行合理的操作。您在这里处于“半合理”的境地,人们会这样做,例如跟踪/etc目录,而无需触摸/etc目录本身,这既简单又有用,但是会出错clean不能清空/etc的未跟踪部分,因为您不能这样做,这不是错误的。您的主目录并非如此。

在某些时候,您需要设置一个仓库来跟踪特定于git的dotfile。可以说这是正确的方法:-)