Boj*_*nCG 5 git workflow dependencies
我有一个较大的项目,其中有很多模块/库及其各自的存储库。这些模块中的大多数是其他模块的依赖项,而不是项目的依赖项。现在已经到了主项目有多个子项目并且许多模块被共享的地步。有些依赖关系的深度超过 3-4 层。
我读过可以在项目内部更新/拉取子模块,但这仅适用于第一级子模块。假设这些子模块有自己的子模块(第二级),并且某些第一级子模块共享相同的第二级子模块。另外,第二级子模块有它们的子模块(lvl3)等。现在我应该做的是首先推送第三级中所做的更改,而不是更新第二级模块中的子模块并推送这些子模块,现在我可以转到第一级,更新和推送,最后更新我的项目子模块并推送它们。
现在这不仅是更多的工作,而且仍然没有解决我的问题,为什么我需要这样的东西,即当对相互依赖的存储库进行更改时能够轻松地推送和拉取多个存储库。很容易发生这样的情况:团队中的某人在 5 个存储库中的 4 个中推送更改,而当其他成员拉动除此之外的所有存储库时,生产线就会停止,直到发现错误。
对此我能做什么?也许有一些关于工作流程的建议,有没有其他人遇到过这个问题,或者 Git 中是否有一些功能可以解决这个问题。
我推荐android使用的repo工具。它足够通用,可以与任何 git 托管环境一起使用,并且不需要像子模块那样提交超级项目来更新子项目。
首先,按照此处所述安装客户端:https ://source.android.com/source/downloading.html#installing-repo
然后创建一个清单存储库。清单是一个 xml 文件,描述了 git 存储库位置以及应检出它们的路径。像这样:
mkdir manifests
cd manifests
git init
Run Code Online (Sandbox Code Playgroud)
创建清单文件default.xml:
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="github" fetch="ssh://git@github.com" />
<default remote="github" revision="master" />
<project name="git/git.git" path="git" />
<project name="libgit2/libgit2.git" path="vendor/libgit2" />
</manifest>
Run Code Online (Sandbox Code Playgroud)
然后添加、提交清单并推送到某处:
git add default.xml
git commit -m "My first try at a manifest file"
git push git@github.com:myusername/manifests.git master
Run Code Online (Sandbox Code Playgroud)
现在您可以使用该repo命令了。
mkdir myproject
cd myproject
repo init -u git@github.com:myusername/manifests.git
repo sync -j2
Run Code Online (Sandbox Code Playgroud)
您的 git 存储库将被克隆。您现在可以像平常一样在每一项中工作。在您推送到任何项目后,其他人需要做的就是 a repo sync,他们就会更新到最新版本(另请参阅 参考资料repo start)。
您可能需要重新组织您的项目。通常,您可能会将其他模块作为子目录 ( myproject/vendor/dependency)。虽然您仍然可以使用存储库维护此布局,但它将导致 git 存储库被另一个存储库签出。通过.gitignore欺骗,它可能是可行的,但我建议重新组织您的项目,这样存储库就不需要相互检查。
有关 xml 文件中每一项的完整说明,请参阅https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.txt 。
有关简单命令参考, 请参阅https://source.android.com/source/using-repo.html 。repo help也很有用。repo upload注意:除非您使用 Gerrit,否则您应该忽略。
<remote name="github" fetch="ssh://git@github.com" />这就像在git. 这意味着我们可以引用给定名称的 url。
<default remote="github" revision="master" />default 元素指定项目的默认选项。这相当于在每个项目上添加remote和revision项目。这只是节省了一些打字时间。
<project name="git/git.git" path="git" />这才是真正的工作发生的地方。 repo sync将获取名称并使用斜杠将其附加到远程。在这种情况下,远程是默认的github,因此它将获取 url ssh://git@github.com/git/git.git。它将把项目检出到git指定版本的路径(在本例中默认为master)。后续的repo syncs 将签出最新版本(在分支的情况下)。