SVN:Git中的外部等价物?

xriantvc  于 2023-05-05  发布在  Git
关注(0)|答案(3)|浏览(204)

我有两个SVN项目正在使用,它们来自另一个使用svn:externals的SVN存储库。
如何在Git中拥有相同的仓库布局结构?

vs3odd8k

vs3odd8k1#

Git有两种方法类似于svn:externals,但并不完全等同:

*子树合并将外部项目的代码插入到存储库中的单独子目录中。它有一个detailed process to set up,对于其他用户来说非常容易,因为它是在 checkout 或克隆存储库时自动包含的。这可能是在项目中包含依赖项的一种方便方法。

从另一个项目中拉取更改很容易,但提交回更改很复杂。如果另一个项目必须从您的代码中合并,项目历史将合并,两个项目实际上成为一个项目。

  • Git submodulesmanual)链接到另一个项目仓库中的特定提交,很像带有-r参数的svn:externals.子模块很容易设置,但所有用户都必须管理子模块,这些子模块不会自动包含在 checkout (或克隆)中。

虽然将更改提交回其他项目很容易,但如果repo已更改,这样做可能会导致问题。因此,通常不适合将更改提交回正在进行开发的项目。

xdyibdwo

xdyibdwo2#

正如我在“Git submodule new version update”中提到的,您可以使用Git 1.8.2子模块实现相同的SVN外部特性

git config -f .gitmodules submodule.<path>.branch <branch>

这足以让子模块跟随分支(如子模块upstream repo的远程分支的LATEST提交)。你需要做的就是:

git submodule update --remote

这将更新子模块。
更多信息请参见“git submodule tracking latest”。

将已有的子模块转换为跟踪分支的子模块:请参阅“Git submodules: Specify a branch/tag”中的所有步骤。

rsaldnfx

rsaldnfx3#

作者:gil (git links) tool
我有一个解决问题的替代方案-gil (git links) tool
它允许描述和管理复杂的git仓库依赖关系。
它还提供了一个解决git递归子模块依赖问题的方法。
假设您有以下项目依赖项:sample git repository dependency graph
然后你可以定义.gitlinks文件与仓库关系描述:

# Projects
CppBenchmark CppBenchmark https://github.com/chronoxor/CppBenchmark.git master
CppCommon CppCommon https://github.com/chronoxor/CppCommon.git master
CppLogging CppLogging https://github.com/chronoxor/CppLogging.git master

# Modules
Catch2 modules/Catch2 https://github.com/catchorg/Catch2.git master
cpp-optparse modules/cpp-optparse https://github.com/weisslj/cpp-optparse.git master
fmt modules/fmt https://github.com/fmtlib/fmt.git master
HdrHistogram modules/HdrHistogram https://github.com/HdrHistogram/HdrHistogram_c.git master
zlib modules/zlib https://github.com/madler/zlib.git master

# Scripts
build scripts/build https://github.com/chronoxor/CppBuildScripts.git master
cmake scripts/cmake https://github.com/chronoxor/CppCMakeScripts.git master

每行以以下格式描述git link:
1.存储库的唯一名称
1.仓库的相对路径(从.gitlinks文件的路径开始)
1.将在git clone命令仓库分支中用于 checkout 的Git仓库
1.空行或以#开头的行不会被解析(被视为注解)。
最后,你需要更新你的root sample repository:

# Clone and link all git links dependencies from .gitlinks file
gil clone
gil link

# The same result with a single command
gil update

因此,您将克隆所有必需的项目,并以适当的方式将它们彼此链接。
如果你想提交某个仓库中的所有更改,并提交子链接仓库中的所有更改,你可以用一个命令来完成:

gil commit -a -m "Some big update"

Pull、Push命令以类似的方式工作:

gil pull
gil push

Gil(git links)工具支持以下命令:

usage: gil command arguments
Supported commands:
    help - show this help
    context - command will show the current git link context of the current directory
    clone - clone all repositories that are missed in the current context
    link - link all repositories that are missed in the current context
    update - clone and link in a single operation
    pull - pull all repositories in the current directory
    push - push all repositories in the current directory
    commit - commit all repositories in the current directory

更多关于git递归子模块依赖问题。

相关问题