两个git仓库在一个目录?

是否有可能在一个目录中有2个git仓库? 我不会想,但是我想问问。 基本上,我想检查我的主目录configuration文件(如.emacs),这些文件应该在所有我工作的机器上是通用的,但是有一个本地文件的存储库(例如.emacs.local),它包含机器特定的configuration。 我能想到的唯一方法就是在本地configuration一个子目录,并忽略主git仓库中的子目录。 任何其他的想法?

如果我明白你在做什么,你可以在一个仓库中处理所有的事情,为每台机器使用单独的分支,以及一个包含共同主目录configuration文件的分支。

初始化回购并提交通用文件,也许将MASTER分支重命名为Common。 然后从那里为每个使用的机器创build一个单独的分支,并将机器特定的文件提交到该分支。 任何时候,你改变你的公共文件,将公共分支合并到每个机器分支,并推送到你的其他机器(如果有很多,写一个脚本)。

然后在每台机器上检查那台机器的分支,这个分支也包含了通用的configuration文件。

本文涵盖了这个比较好:

http://git-scm.com/blog/2010/04/11/environment.html

基本上,如果你正在从命令行工作,这比你想象的更简单。 假设你想要2个git仓库:

 .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' 

所以你可以使用less一点的方式提交给其中的一个,比如gitone commit -m "blah"

似乎更棘手的是忽略。 由于.gitignore通常位于项目根目录下,所以你需要find一种切换方式,而不必切换整个根目录。 或者,您可以使用.git / info / exclude,但是您执行的所有忽略不会被提交或推送 – 这可能会导致其他用户无法使用。 其他使用repo的用户可能会推送.gitignore,这可能会导致冲突。 我不清楚解决这些问题的最好方法。

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

看看git submodule 。

子模块允许将外部存储库embedded到源树的专用子目录中,始终指向特定的提交。

RichiH写了一个名为vcsh的工具,它使用git的伪裸露回购来pipe理点文件,把多个工作目录放到$ HOME中。 与csh AFAIK无关。

但是,如果你确实有多个目录,一个替代git-submodules(这是最好的情况下的痛苦,这个例子的用法不是最好的情况)是gitslave ,这使得从属回购在一个并且不需要三个步骤的过程来对子仓库进行更改(检出到正确的分支,进行提交更改,然后进入超级项目并提交新的子模块提交)。

通过使用variablesGIT_DIR是可能的,但是如果你不知道自己在做什么,就会有许多警告。

是的,submodules可能是你想要的。 另一个select是将您的工作副本放在一个子目录中,然后将您主目录中的符号链接指向感兴趣的文件。

我的首选方法是在子目录中使用回购,并使用recursion符号链接:

 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”。

另一种select是将它们放在单独的文件夹上,并创build从一个文件夹到另一个文件夹的符号硬链接。

例如,如果有存储库:

  1. Repo1 / FolderA
  2. Repo1 / FolderB中

和:

  1. Repo2 / FolderC

您可以将Repo1中的文件夹FolderAFolderB符号链接到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以避免噪音,除非您想要。