101

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

4

10 回答 10

191

本文相对较好地涵盖了这一点:

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,以便满足这些工具的假设。

于 2013-06-26T06:50:40.073 回答
43

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

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

然后在每台机器上,检出该机器的分支,其中也将包含通用配置文件。

于 2009-01-13T04:24:06.357 回答
16

看看git submodule

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

于 2009-01-12T17:05:39.937 回答
6

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

于 2010-08-23T14:06:03.483 回答
6

RichiH 编写了一个名为vcsh的工具,该工具使用 git 的假裸 repos 来管理 dotfiles,将多个工作目录放入 $HOME。与 csh AFAIK 无关。

但是,如果您确实有多个目录,则 git-submodules 的替代方案(在最好的情况下会很痛苦,并且此示例的用法不是最好的情况)是gitslave,它使从属存储库在尖端签出始终分支,并且不需要三步过程来对子仓库进行更改(签出到正确的分支,进行并提交更改,然后进入超级项目并提交新的子模块提交)。

于 2012-03-15T16:16:54.450 回答
4

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

于 2009-01-12T18:30:02.000 回答
4

我首选的方法是在子目录中使用 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”。

于 2014-03-21T18:44:50.590 回答
1

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

例如,如果有存储库:

  1. Repo1/文件夹A
  2. 回购1/文件夹B

和:

  1. Repo2/文件夹C

您可以将文件夹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以避免噪音,除非您愿意。

于 2016-12-04T03:22:41.957 回答
1

是的,可以在一个目录中有两个 git 存储库。

我假设一个远程存储库在 GitHub 中,另一个在 GitLab 中。我还使用两个不同的 SSH 密钥连接到这些远程存储库。

您可以在 GitHub / GitLab 之一中拥有两个远程存储库(并使用单个 SSH 密钥) - 不会有太大变化。

先决条件

  • 公共 SSH 密钥(id_ecdsa.pub/ id_rsa.pub/id_ed25519.pub等)存在于您的 GitHub 和 GitLab 配置文件中

  • 私人 SSH 密钥(id_ecdsa/ id_rsa/id_ed25519等)被添加并保留在您的操作系统的钥匙串中

  • SSH 配置文件具有为 GitHub 和 GitLab 指定的密钥:

    Host github.com
      Hostname github.com
      AddKeysToAgent yes
      UseKeychain yes
      IdentityFile ~/.ssh/id_ecdsa
    
    Host gitlab.com
      Hostname gitlab.com
      AddKeysToAgent yes
      UseKeychain yes
      IdentityFile ~/.ssh/id_rsa
    

这是克里斯模拟工作流程的答案的细分

  • 在目录中初始化 git:

    git init

  • 将 git 连接到一个远程存储库(位于 GitHub 中)

    git remote add origin git@github.com:your-username/your-repo.git

  • 重命名.git.github

    mv .git .github

  • 再次初始化 git

    git init

  • 将 git 连接到另一个远程存储库(位于 GitLab 中)

    git remote add origin git@gitlab.com:your-username/your-repo.git

  • 重命名.git.gitlab

    mv .git .gitlab

  • 验证当前目录是否连接到两个不同的远程存储库

    git --git-dir=.github remote -v

    git --git-dir=.gitlab remote -v

  • 拉取远程(GitHub 和 GitLab)存储库

    git --git-dir=.github pull origin main
    git --git-dir=.gitlab pull origin main
    
  • 将文件添加到两个存储库

    git --git-dir=.github add README.md
    git --git-dir=.gitlab add README.md
    
  • 写提交信息

    git --git-dir=.github commit -m "operational overview"
    git --git-dir=.gitlab commit -m "operational overview"
    
  • 推送到远程

    git --git-dir=.github push -u origin main
    git --git-dir=.gitlab push -u origin main
    

我们在这里做的唯一额外的事情是使用--git-dir标志。

如果您打算经常这样做,您可以在您的 shell 配置文件中添加一个别名(如.zprofilebashrc等):

export github="git --git-dir=.github"
export gitlab="git --git-dir=.gitlab"

pull像, push, add,这样的未来操作commit可以像 - github pull origin main, gitlab pull origin main, 等一样执行。

于 2021-12-11T18:15:28.057 回答
0

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

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

于 2017-12-07T00:09:26.837 回答