使用稀疏结账进行Git提交/推/拉

时间:2016-03-10 19:35:24

标签: git version-control sparse-checkout

我昨天开始使用Git,在此之前我使用SVN多年了。让我解释一下我到底想要实现的目标:

我有一个主要的git repo用于不同的项目。像这样:

  • main_repo / proj1
  • main_repo / proj2
  • main_repo / proj3

我无法为这些子项目创建单独的回购。现在我(或其他用户)应该能够签出/提交/推送/拉入这些独立项目。

对于这件事,我正在尝试使用以下命令进行稀疏检查:

  1. mkdir proj1; cd proj1
  2. git init
  3. git remote add origin https://main_repo
  4. git config core.sparsecheckout true
  5. echo "proj1/" > .git/info/sparse-checkout
  6. git pull origin master
  7. 现在我需要的是将proj1中存在的所有文件放在同一个当前目录中。我得到的是这样的:

    /proj1/proj1/files_and_dirs_in_proj1
    

    我需要什么:

    /proj1/files_and_dirs_in_proj1
    

    其次,checkout-dir的行为与git repo不同。它不带任何.git目录。所以我不明白如何在稀疏检查项目中进行提交/推/拉。

    我希望我解释得很清楚。请建议。

3 个答案:

答案 0 :(得分:1)

如果我已正确理解你,那么你想:

  • 创建包含3个项目的git存储库(子文件夹proj1,proj2,proj3)
  • 为每个使用其项目的团队创建单独的目录(例如teamproj1,teamproj2,teamproj3)
  • 这些文件夹应该只包含属于相应项目的文件(例如teamproj1文件夹只有proj1子文件夹等)

在这种情况下,您可以使用以下简单步骤:

1)将主回购添加到git

N + 1

2)克隆&调整你的每个命令的git回购(teamproj1,teamproj2,teamproj3,...)。为每个团队/项目重复以下代码

git init
git remote add origin ...
git add .
git commit -m 'Initial commit'
git push

3)宾果。每个命令都有自己的文件夹和项目。这个文件夹是普通的git repo,但这个repo只显示一些文件,这些文件将在git clone ... teamproj1 cd teamproj1 git config core.sparsecheckout true echo 'proj1' › .git/info/sparse-checkout git read-tree -m -u HEAD

我已经添加了一些图纸以便于理解这个方案

enter image description here

答案 1 :(得分:0)

最近的 git sparse-checkout I mention here 可以提供帮助,尤其是与 git clone --filter=blob:none --no-checkout 结合使用时

git clone --filter=blob:none --no-checkout https://github.com/<me>/<myrepo>
git config core.sparseCheckoutCone false
git sparse-checkout disable

# Add the expected pattern, to include just a subfolder without top files:
git sparse-checkout set /mySubFolder/

# populate working-tree with only the right files:
git read-tree -mu HEAD

此外,使用 Git 2.32(2021 年第二季度)、“git add(man)git rm(man) 学会了不要触及稀疏结账之外的那些路径。

因此您不会对相关子模块之外的路径犯任何错误。

参见 commit d5f4b82commit a20f704commit b243012commit 719630ecommit d73dbafcommit 6594afccommit 4e95698(2021 年 4 月 8 日)来自Matheus Tavares (matheustavares)
(由 Junio C Hamano -- gitster --commit fe069dc 合并,2021 年 5 月 7 日)

<块引用>

rm:尊重稀疏结账模式

推荐人:Elijah Newren
签字人:Matheus Tavares

<块引用>

git add(man) 避免添加或更新当前稀疏检出之外的索引条目,但 git rm({{3 }}) 不遵循相同的限制。
这有点违反直觉和不一致。
因此,让 rm 遵守稀疏规则,并建议如何像 SKIP_WORKTREE 一样删除 add 条目。
还要为新行为添加一些测试。

git config 现在包含在其 man 中:

<块引用>

建议在 man pagegit add 时显示 被要求更新当前稀疏之外的索引条目 结帐。

git rm 现在包含在其 git rm 中:

<块引用>

允许仅从索引中删除文件。什么时候 sparse-checkouts 正在使用中(见 man page), git rm 只会删除稀疏结账模式中的路径。

答案 2 :(得分:-1)

首先,git不是svn,不同的概念,不同的方法。 Git是客户端上的完整源代码控制系统,而不是远程服务器的前端

其中一个不同之处在于您克隆整个存储库而不是子部分。我相信有一些方法可以让它出现,你只是克隆了一个子集,但实际上整个回购都在那里。

在我所做的测试/使用中,没关系。是的,也许最初的克隆速度有点慢,但之后真的很快。我的公司拥有一个大型4G +源代码树存储库,100多名开发人员,每个人都拥有一份完整的回购副本,即使他们的责任可能被分割,甚至远离我们平庸的公司WAN,也没有任何问题。