是否可以在一个目录中拥有2个git存储库?我想不会,但我想我会问。基本上,我想检查我的主目录配置文件(例如.emacs),它应该在我工作的所有机器上是通用的,但是有一个本地文件的第二个存储库(例如.emacs.local),其中包含机器特定的配置。我能想到的唯一方法是将本地配置放在子目录中,并忽略主git存储库中的子目录。还有其他想法吗?
答案 0 :(得分:138)
本文相对较好地介绍了这一点:
基本上,如果您使用命令行工作,这比您猜测的要简单。假设你想要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)
子模块允许外部存储库 嵌入专用的 源树的子目录, 总是指着一个特定的提交。
答案 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)
另一个选项是将它们放在单独的文件夹中,并创建从一个文件夹到另一个文件夹的符号硬链接。
例如,如果有存储库:
和
您可以将文件夹FolderA
和FolderB
从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个示例存储库可供试用。