一个目录中有两个git存储库?

时间:2009-01-12 17:01:24

标签: git git-submodules git-subrepo

是否可以在一个目录中拥有2个git存储库?我想不会,但我想我会问。基本上,我想检查我的主目录配置文件(例如.emacs),它应该在我工作的所有机器上是通用的,但是有一个本地文件的第二个存储库(例如.emacs.local),其中包含机器特定的配置。我能想到的唯一方法是将本地配置放在子目录中,并忽略主git存储库中的子目录。还有其他想法吗?

9 个答案:

答案 0 :(得分:138)

本文相对较好地介绍了这一点:

https://github.com/rrrene/gitscm-next/blob/master/app/views/blog/progit/2010-04-11-environment.markdown

基本上,如果您使用命令行工作,这比您猜测的要简单。假设你想要2个git repos:

.gitone
.gittwo

你可以像这样设置它们:

git init .
mv .git .gitone
git init .
mv .git .gittwo

您可以添加一个文件并将其提交给只有这样的文件:

git --git-dir=.gitone add test.txt
git --git-dir=.gitone commit -m "Test"

所以git的选项首先是命令,然后是命令,然后是git命令的选项。您可以轻松地为git命令添加别名,如:

#!/bin/sh
alias gitone='git --git-dir=.gitone'
alias gittwo='git --git-dir=.gittwo'

所以你可以通过一点点打字来提交其中一个,比如gitone commit -m "blah"

看起来更棘手的是忽略。由于.gitignore通常位于项目根目录中,因此您需要找到一种方法来切换它,而无需切换整个根目录。或者,您可以使用.git / info / exclude,但是您执行的所有忽略都不会被提交或推送 - 这可能会搞砸其他用户。使用任何一个repo的其他人可能会推送.gitignore,这可能会导致冲突。我不清楚解决这些问题的最佳方法。

如果你喜欢像TortoiseGit这样的GUI工具,你也会遇到一些挑战。您可以编写一个小脚本,暂时将.gitone或.gittwo重命名为.git,以便满足这些工具的假设。

答案 1 :(得分:31)

如果我了解您正在做什么,您可以在一个存储库中处理所有内容,为每台计算机使用单独的分支,以及包含公共主目录配置文件的分支。

初始化repo并将公共文件提交给它,也许将MASTER分支重命名为Common。然后为您使用的每台机器创建一个单独的分支,并将特定于机器的文件提交到该分支。每次更改公共文件时,将公共分支合并到每个机器分支中并推送到其他计算机(如果有很多,请编写脚本)。

然后在每台机器上,检查该机器的分支,其中还包括公共配置文件。

答案 2 :(得分:13)

查看git submodule

  

子模块允许外部存储库   嵌入专用的   源树的子目录,   总是指着一个特定的提交。

答案 3 :(得分:5)

RichiH编写了一个名为vcsh的工具,该工具使用git的假裸存储库管理dotfiles,将多个工作目录放入$ HOME。与csh AFAIK没什么关系。

但是,如果你确实有多个目录,那么git-submodules的替代方案(在最好的情况下这是一种痛苦而这个示例用法并不是最好的情况)是gitslave,它留下了奴隶回购在任何时候都检查了分支的提示,并且不需要三步流程来更改子仓库(检查到正确的分支,进行并提交更改,然后进入超级项目并提交新的子模块提交)。

答案 4 :(得分:4)

可以使用变量GIT_DIR,但如果您不知道自己在做什么,则会有很多警告。

答案 5 :(得分:3)

是的,子模块可能就是你想要的。另一种选择是将您的工作副本放在子目录中,然后将符号链接从您的主目录指向感兴趣的文件。

答案 6 :(得分:3)

我首选的方法是在子目录中使用repo,并使用递归符号链接:

git clone repo1
cd somerepo
git clone repo2
cd repo2
./build

' repo / build ' - 文件如下所示:

#!/bin/bash 
SELF_PATH="$(dirname "$(readlink -f "$0")" )"  # get current dir 
cd .. && git stash && git clean -f -d ''       # remove previous symlinks
cp -sR "$SELF_PATH"/* ../.                     # create recursive symlinks in root

警告:不要使用'git add'。

答案 7 :(得分:0)

另一个选项是将它们放在单独的文件夹中,并创建从一个文件夹到另一个文件夹的符号硬链接。

例如,如果有存储库:

  1. Repo1 / FolderA
  2. Repo1 / FolderB中
    1. Repo2 / FolderC
    2. 您可以将文件夹FolderAFolderB从Repo1符号链接到Repo2。对于Windows,在Repo1上运行的命令将是:

      User@Repo1$ mklink /J FullPath/Repo2/FolderA FullPath/Repo1/FolderA
      User@Repo1$ mklink /J FullPath/Repo2/FolderB FullPath/Repo1/FolderB
      User@Repo1$ printf "/FolderA/*\n/FolderB/*\n" >> .gitignore
      

      对于主存储库中的文件,您需要对它们中的每一个进行符号链接,并将它们添加到存储库.gitignore以避免噪声,除非您想要它。

答案 8 :(得分:0)

免责声明:这不是广告。我是提供的库的开发者。

我已经创建了一个git扩展来处理你想要将多个存储库混合到一个文件夹中的情况。 lib的优点是,可以跟踪存储库和文件冲突。你可以在github找到它。还有2个示例存储库可供试用。