gpt4 book ai didi

Git repo,其中每个子模块都是同一 repo 的一个分支。如何避免双重/三重...使用 git clone --recursive 下载?

转载 作者:太空狗 更新时间:2023-10-29 13:44:54 25 4
gpt4 key购买 nike

假设我有以下项目树:

src
data
doc

我想将所有文件夹保存在 Git 存储库中,并发布到 Gitlab。但我不想将 datadocsrc 一起跟踪。

所以我使用以下策略:

git remote add origin ADDRESS
git submodule add -b data ADDRESS data
git submodule add -b doc ADDRESS doc

它实际上工作正常,除非我尝试使用以下方法复制存储库:

git clone --recursive ADDRESS

所有对象都被传输了 3 次:root 和 data 以及 doc 都包含:

  • 来源/主人
  • 来源/数据
  • 来源/文档

有没有简单的方法可以避免这种情况?只是为了澄清我想要什么:

  • master 仓库应该只获取origin/master,而不是其他两个
  • 数据子模块应该只获取origin/data
  • doc 子模块应该只获取 origin/doc

使用 3 个独立的存储库很容易实现,但这太麻烦了,因为我将这种方法应用于多个项目。

更新

git worktree 来自 this answer允许我手动实现我想要的。

但现在,而不是自动方法(消耗 4 倍带宽):

git clone --recursive git@foo:foo/bar.git

我必须做的:

git clone git@foo:foo/bar.git
cd bar
git worktree add data origin/data
git worktree add src/notebooks origin/notebooks
git worktree add doc origin/doc
git worktree add reports origin/reports

我可以用一些脚本自动执行这个过程,因为 .gitmodules 文件已经包含了完整的信息:

[submodule "data"]
path = data
url = git@foo:foo/bar.git
branch = data
[submodule "src/notebooks"]
path = src/notebooks
url = git@foo:foo/bar.git
branch = notebooks
[submodule "doc"]
path = doc
url = git@foo:foo/bar.git
branch = doc
[submodule "reports"]
path = reports
url = git@foo:foo/bar.git
branch = reports

我想知道是否已经有一些标准的 git 脚本或标志来处理这个问题?

最佳答案

Git 被设计成分布式的,这意味着每个用户都应该拥有完整的历史记录和所有分支。如果你想要一个单一的裸仓库,但是不同的工作树来减少网络流量,你可以使用 git worktree 命令来实现:

所以在你的情况下,假设你有一个 src 文件夹作为带有 src 分支的主文件夹,从中创建另外两个应该像

git worktree add ../data data
git worktree add ../doc doc

看到这个很棒的答案 https://stackoverflow.com/a/30185564/3066081获取有关此命令的更多信息。但是如果你有一个没有工作树支持的旧 git,你可以使用 git-new-workdir script as

git-new-workdir project-dir new-workdir branch

Multiple working directories with Git? 中也对此进行了描述

关于Git repo,其中每个子模块都是同一 repo 的一个分支。如何避免双重/三重...使用 git clone --recursive 下载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43356087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com