0

这是我在这里的第一个问题,如果不好,请见谅。

我使用 git 备份了一些主文件,其中包括 vim 插件,我经常将其保存为 git 存储库,因此我自己的存储库中有几个 git 存储库。可悲的是,当我使用这些 subrepos 时没有被添加

 git add . -A

在我的主文件夹的副本上。

我找到了一些解决方案:

  • 我听说有一种添加子模块的方法,但由于某种原因,它们被放在了 repo 的根目录中,所以我每次添加它们后都必须手动移动它们,如果删除子模块也很麻烦我想改变一些东西。
  • 另一种方法是删除 vim 插件的 .git 文件夹,但这意味着丢失插件来自何处的信息,并且会使更改更难。

有没有其他方法可以做到这一点?

如果我可以将每个子存储库添加为常规文件,我会很好,缺点是更改会被跟踪两次。

4

2 回答 2

0

扩展@Greduan 和我的评论:

您可以将本地 git 存储库添加为带有git submodule add <repo> <path>.

根据 Git SCM 文档submodule add

这至少需要一个参数:<repository>. 可选参数<path>是克隆子模块存在于超级项目中的相对位置

TL;DR:如果<repo><path>相同,则可以避免将子存储库克隆到父存储库


现在,举个例子(我很想知道这实际上是如何工作的,我想我会尝试一下并发布我的结果):

假设我们有一个父 repo in./和一个子 repo in ./some/folder/child-repo

您可以添加子模块而无需通过以下方式克隆它:

git submodule add ./some/folder/child-repo ./some/folder/child-repo #same location

这将child-repo在其当前位置添加作为子模块。

Git 将输出如下内容:Adding existing repo at 'some/folder/child-repo' to the index.

如果您运行git status,您应该会看到两个准备提交的新文件:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   .gitmodules
#       new file:   some/folder/child-repo
#

.gitmodules是描述您的模块的文件,另一个文件是子存储库表示。

将子模块提交到父仓库:git commit -m 'add child-repo as submodule'

此时,您在子存储库中所做的任何提交都将显示在存储库中,如下所示:

# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   some/folder/child-repo (new commits)
#

然后,您可以运行git submodule update以更新父存储库。你有它 - 没有不必要的重复或额外的提交:)

警告:如果您submodule update在父代码库中运行后需要使用子代码库,您会发现子代码库将处于分离的 HEAD状态。这记录在git submodule手动更新部分。

git checkout master您可以在子存储库中使用(或您正在使用的任何分支)修复它。

于 2013-09-19T17:23:30.893 回答
0

我可以建议切换到vim-addon-managerVundle来保存第三方插件。主要思想是您将要安装的插件的名称放入 vimrc 中,但配置 VAM/Vundle 以将它们安装到 VCS 未跟踪的位置。然后,如果您想从备份中恢复,您允许 (VAM) 或明确要求 (Vundle,如果我没记错的话) 安装您在配置中列出的所有插件。

文档中的 VAM 甚至有一个功能(在安装部分列出),它将首先检查是否已经安装了 VAM,如果没有安装它,然后继续使用插件。

这个变体消除了对子模块的需要,而不是解决它们的问题。

您可能还会发现VAM 与其他具有类似目的的插件之间的有趣比较

于 2013-09-19T20:24:53.827 回答