2

我昨天开始使用 Git,在此之前我使用 SVN 已经很多年了。让我解释一下我到底想要达到什么目标:

我有一个针对不同项目的主要 git 存储库。像这样的东西:

  • 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

现在我需要的是在同一个当前目录中获取 proj1 中存在的所有文件。我得到的是这样的:

/proj1/proj1/files_and_dirs_in_proj1

我需要的:

/proj1/files_and_dirs_in_proj1

其次,checkout-dir 的行为不像 git repo。它不携带任何 .git 目录。所以我不明白如何在 sparse-checkedout projs 中进行提交/推送/拉取。

我希望我解释得很好。请建议。

4

3 回答 3

1

如果我正确理解了您,那么您想要:

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

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

1) 将你的主仓库添加到 git

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

2)为每个命令(teamproj1,teamproj2,teamproj3,...)克隆并调整您的 git 存储库。为每个团队/项目重复以下代码

git clone ... teamproj1
cd teamproj1
git config core.sparsecheckout true
echo 'proj1' › .git/info/sparse-checkout
git read-tree -m -u HEAD

3)宾果游戏。每个命令都有自己的文件夹和项目。这个文件夹是普通的 git repo,但是这个 repo 只会显示一些文件.git/info/sparse-checkout

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

在此处输入图像描述

于 2016-03-10T23:35:44.810 回答
0

git sparse-checkout在这里提到的最近可以提供帮助,尤其是与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 addmanman学会了不要触及那些在稀疏结账之外的路径。git rm

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

请参阅Matheus Tavares ( )的提交 d5f4b82提交 a20f704提交 b243012提交 719630e提交 d73dbaf提交 6594afc提交 4e95698(2021 年 4 月 8 日) 。(由Junio C Hamano 合并 -- --fe069dc 提交中,2021 年 5 月 7 日)matheustavares
gitster

rm: 尊重稀疏结帐模式

建议人:Elijah Newren
签字人:Matheus Tavares

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

rmSKIP_WORKTREEadd

git config现在在其手册页中包含:

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

git rm现在在其手册页中包含:

允许仅从索引中删除文件。使用稀疏签出时(请参阅 参考资料git sparse-checkout), git rm只会删除稀疏签出模式中的路径。


使用 Git 2.34(2021 年第四季度),“ git addman可以更好地处理稀疏索引。

请参阅Derrick Stolee ( ) 的提交 42f8ed6提交 939fa07提交 4eaffd8提交 5e7cbab提交 83ad8ca(2021 年 7 月 29 日(由Junio C Hamano 合并 -- --提交 2f71366中,2021 年 8 月 24 日)derrickstolee
gitster

add: 在 refresh() 中忽略稀疏结帐之外

审核人:Elijah Newren
签字人:Derrick Stolee

由于b243012refresh_index():添加标志以忽略SKIP_WORKTREE条目,2021-04-08,Git v2.32.0-rc0 -批次 #14中列出的合并):添加标志以忽略条目,2021-04-08),' ' man当路径超出 sparse-checkout 定义时将输出警告消息。 此警告的实施与 sparse-index 工作并行发生,以在整个代码库中添加调用。(refresh_index()SKIP_WORKTREEgit add --refresh <path>
ensure_full_index()

更新此循环以具有适当的逻辑来检查 pathspec 是否在 sparse-checkout 定义之外。
这避免了扩展稀疏目录条目并确定路径是否被跟踪、未跟踪或忽略的需要。
我们只是避免更新 stat() 信息,因为甚至没有与路径匹配的条目!

于 2021-05-13T19:52:48.433 回答
-2

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

不同之处之一是您克隆整个存储库而不是小节。我相信有一些方法可以让你看起来只克隆了一个子集,但实际上整个 repo 都在那里。

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

于 2016-03-11T02:51:57.497 回答