我昨天开始使用Git,在此之前我使用SVN多年了。让我解释一下我到底想要实现的目标:
我有一个主要的git repo用于不同的项目。像这样:
我无法为这些子项目创建单独的回购。现在我(或其他用户)应该能够签出/提交/推送/拉入这些独立项目。
对于这件事,我正在尝试使用以下命令进行稀疏检查:
mkdir proj1; cd proj1
git init
git remote add origin https://main_repo
git config core.sparsecheckout true
echo "proj1/" > .git/info/sparse-checkout
git pull origin master
现在我需要的是将proj1中存在的所有文件放在同一个当前目录中。我得到的是这样的:
/proj1/proj1/files_and_dirs_in_proj1
我需要什么:
/proj1/files_and_dirs_in_proj1
其次,checkout-dir的行为与git repo不同。它不带任何.git目录。所以我不明白如何在稀疏检查项目中进行提交/推/拉。
我希望我解释得很清楚。请建议。
答案 0 :(得分:1)
如果我已正确理解你,那么你想:
在这种情况下,您可以使用以下简单步骤:
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
我已经添加了一些图纸以便于理解这个方案
答案 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 d5f4b82、commit a20f704、commit b243012、commit 719630e、commit d73dbaf、commit 6594afc、commit 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 page 或 git add
时显示
被要求更新当前稀疏之外的索引条目
结帐。
git rm
现在包含在其 git rm
中:
允许仅从索引中删除文件。什么时候
sparse-checkouts 正在使用中(见 man page),
git rm
只会删除稀疏结账模式中的路径。
答案 2 :(得分:-1)
首先,git不是svn,不同的概念,不同的方法。 Git是客户端上的完整源代码控制系统,而不是远程服务器的前端
其中一个不同之处在于您克隆整个存储库而不是子部分。我相信有一些方法可以让它出现,你只是克隆了一个子集,但实际上整个回购都在那里。
在我所做的测试/使用中,没关系。是的,也许最初的克隆速度有点慢,但之后真的很快。我的公司拥有一个大型4G +源代码树存储库,100多名开发人员,每个人都拥有一份完整的回购副本,即使他们的责任可能被分割,甚至远离我们平庸的公司WAN,也没有任何问题。