使用Git的多个工作目录?

时间:2011-06-07 18:53:29

标签: git

我不确定这是否是Git支持的东西,但从理论上来说它似乎对我有用。

我的工作流程通常涉及同时编辑多个分支中的文件。换句话说,我经常想在一个分支中打开一些文件,而我在另一个分支中编辑另一个文件的内容。

我对此的典型解决方案是进行两次检查,但遗憾的是我不能在它们之间共享分支和引用。我想要的是只有两个工作目录由同一个.git文件夹管理。

我知道本地git clone解决方案(默认情况下,用于硬链接共享对象,以及--shared选项,它使用原始repo设置备用对象存储),但这些解决方案仅减少了磁盘空间的使用,特别是在--shared的情况下,似乎充满了危险。

有没有办法使用一个.git文件夹,并有两个工作目录支持它?或者Git是否已经硬编码以便随时检出一个工作目录?

3 个答案:

答案 0 :(得分:113)

git发布内容a contributed script名为git-new-workdir。 您可以按如下方式使用它:

git-new-workdir project-dir new-workdir branch

其中project-dir是包含.git存储库的目录的名称。 此脚本创建另一个.git目录,其中包含许多符号链接到原始目录,但无法共享的文件(如当前分支)除外,允许您在两个不同的分支中工作。

听起来有点脆弱,但这是一个选择。

答案 1 :(得分:11)

我遇到了这个问题,希望找到一个我在这里找不到的解决方案。所以现在我确实找到了我需要的东西,我决定把它发布给其他人。

警告:如果您需要同时同时编辑多个分支,这可能不是一个好的解决方案,例如OP状态。这是为了检查多个分支 同时打算编辑。 (由一个.git文件夹支持的多个工作目录。)

自从我第一次提出这个问题以来,我已经学到了一些东西:

  1. " bare repository"是。它本质上是.git目录的内容,而不是位于工作树中。

  2. 您可以在命令行中使用.git选项git <指定您正在使用的仓库的位置(--git-dir=目录的位置) / p>

  3. 您可以使用--work-tree=

  4. 指定工作副本的位置
  5. 什么是&#34;镜像回购&#34;是

  6. 这是最后一个非常重要的区别。我实际上并不想在回购中工作,我只需要同时检出不同分支和/或标签的副本。实际上,我需要保证分支最终与我的远程分支不同。所以镜子对我来说是完美的。

    因此,对于我的用例,我得到了我需要做的事情:

    git clone --mirror <remoteurl> <localgitdir> # Where localgitdir doesn't exist yet
    mkdir firstcopy
    mkdir secondcopy
    git --git-dir=<localgitdir> --work-tree=firstcopy checkout -f branch1
    git --git-dir=<localgitdir> --work-tree=secondcopy checkout -f branch2
    

    关于这一点的一个重要警告是,两份副本没有单独的HEAD。因此,在上述之后,运行git --git-dir=<localgitdir> --work-tree=firstcopy status将显示从branch2到branch1的所有差异作为未提交的更改 - 因为HEAD指向branch2。 (这就是我使用-f选项checkout的原因,因为我实际上并没有计划在本地进行任何更改。我可以检查任何标记或分支以查找任何工作-tree,只要我使用-f选项。)

    对于在同一台计算机上共存多个签出需要编辑的用例,这非常有效。我不知道是否有任何方法可以为多个工作树提供多个HEAD而没有其他答案所涵盖的脚本,但我希望这对其他人有帮助。

答案 2 :(得分:3)

我能想到的唯一解决方案是克隆两个目录并将它们添加为彼此的远程存储库。然后,您可以继续将已更改的内容拖入另一个内容,而无需将任何内容推送到远程存储库。

我假设你想拥有两个工作目录而不是两个遥控器克隆,因为你不想将一些分支推送到远程。否则,你的遥控器的两个克隆就可以正常工作 - 你只需要进行一些推动和拉动以保持所有三个同步。