连接`.git`目录进行构建有任何危险吗?

时间:2011-09-15 00:16:13

标签: git

我正在设置一个通用的git部署环境,我想知道在.git目录中设置符号链接是否安全?通过这样做,我希望能够从同一个仓库中进行单独检查,而无需拥有潜在大型项目历史的本地副本。

推理(伪流):

  • 网络界面:
    • 点击“将此提交部署到此服务器”
  • 服务器:
    • ln -s ./deploy/.git ./build/.git
    • cd build
    • git fetch
    • git checkout some_commit
    • make
    • 如果成功:
      • cd ..
      • mv build deploy
      • make deploy //只需重置nginx,apache等
    • 如果失败
      • 提醒用户
      • 擦除构建目录,无害“

3 个答案:

答案 0 :(得分:3)

查看git-new-workdir,这是一个专门用于从一个.git目录中检出多个工作目录的工具。

答案 1 :(得分:1)

如果您在本地克隆git存储库,.git目录将使用硬链接。所以你不需要担心空间,至少对于新近克隆的存储库来说。

$ du -chs repo/.git
 27M    repo/.git
 27M    total
$ git clone repo repo2
$ du -chs repo2/.git
 27M    repo2/.git
 27M    total
$ du -chs repo/.git repo2/.git
 27M    repo/.git
292K    repo2/.git
 27M    total

由于git缓存了有关工作副本的信息,因此我对符号链接git目录持谨慎态度。

答案 2 :(得分:0)

在您描述的情况下,将.git目录符号链接是安全的。 (如果你在带有符号链接.git的目录中使用git,它可能会让人感到困惑,因为索引(或暂存区域)将在两者之间共享。)

但是,您不需要为所需内容执行此操作 - 而是可以使用选项git checkout--git-dir运行--work-tree来告诉git哪个存储库目录和工作树使用。例如:

mkdir /home/whatever/build/
git --git-dir=/home/foo/deploy/.git --work-tree=/home/foo/build/ checkout -f

我建议(a)对这两个选项使用绝对路径,(b)使用这两个选项中的任何一个,或者两个都不使用,因为否则目录git实际使用的规则可能会令人困惑。