我不知道我是否把事情说清楚了(因为我不是高级 git 用户),所以请提出后续问题,以更好地了解我来自哪里。
考虑这个存储库:Void Linux 官方
这个 git 存储库用于在官方软件包存储库中构建 Void Linux 的软件包。我无法推/拉,因为他们对可以将哪些包添加到其官方存储库有严格的规则。所以我想为我和我的几个朋友创建我的个人存储库。
void-packages
将构建指令存储在任何包的补丁和模板中,例如 alpine
下的 srcpkgs/alpine/template
。其他文件,如 xbps-src
和目录 common
和 etc
包含实际的构建脚本,用于查看模板和补丁来构建任何包。
我想从存储库中提取
xbps-src
、common
和 etc
中的所有提交,但我不想要 srcpkgs
中所有包的模板,因为我不需要它们,所以就是这样巨大以至于推拉需要花费很多时间。所以,我创建了一个像这样的稀疏拉力:
git config sparsecheckout true
echo '/*' > .git/info/sparse-checkout
echo '!/srcpkgs/*' > .git/info/sparse-checkout
这是我的
origin
遥控器,指向上面的 github 链接。我创建了一个个人存储库,这是我的tilde
遥控器,仅推送我的更改(到srcpkgs
以及上游xbps-src
和其他):
git checkout master
git checkout --orphan temp
git add -A
git commit -m 'New orphaned commit'
git branch -D master
git branch -m master
git push tilde master
我这样做是因为我不想将所有
srcpkgs
包从 origin
推送到 tilde
存储库,并且 master
拥有所有历史记录。所以,我成了孤儿master
。现在假设我创建了一个新包,srcpkgs/brave-browser/template
并提交它。
git add srcpkgs/brave-browser/template
git commit -m 'Added Brave Browser'
git push tilde master
但这不起作用,因为稀疏签出完全忽略了我自己的提交。那么,如何在
origin
中进行稀疏推/拉,同时在 tilde
远程中进行完整推/拉?
这不是稀疏克隆,你克隆了一切。相反,您所做的是告诉 Git 完全忽略工作树中的
srcpkgs
目录,永远不要对其进行写入或读取,因此在添加时您没有添加任何内容。我怀疑在你的孤儿分支的第一次提交中“添加”的其余文件的所有内容都掩盖了这一遗漏。
为了避免获取您不需要查看的内容,更不用说触摸了,一种方法是将
--filter=tree:1 --sparse
添加到您的克隆中,这将设置锥体模式,即整个目录但仅-selected-ones 稀疏规则,克隆后你可以 git sparse-checkout set xbps-src common etc srcpkgs/your-new-package
告诉 Git 你想看到什么(除了顶级文件);它会按需获取这些内容。你的新包还不存在,但你需要告诉 Git 你想要它,因为“稀疏”的默认设置是你希望 Git 将它视为不存在。
当您在 github 上 fork 一个包时,fork 会获取所有现有历史记录,这实际上根本不涉及任何实际历史记录复制 - 与不跨文件系统边界的本地克隆不涉及任何实际历史记录复制的方式大致相同。按照你的方式创建一个全新的存储库会产生更多的成本,任何想要从直叉中获取的东西都可以避免像你一样获取他们不想要的东西。
所以你想要的只是分叉上游,从那里获取并正常推送到你的分叉。它只会发送自最后一个祖先以来已更改的对象 Git 可以看到上游已经有(或者可能不在任何提交中 Git 可以通过检查上游的提示来看到它和上游都有,我忘记了,它没有这里并不重要)。
如果您真的想要一个单包 srcpkgs 目录,您可以在添加稀疏签出之后立即
git rm --cached srcpkgs/*
,然后再添加新包。
还有很多方法可以做到这一点,Git 在一个简单的底层结构上运行,其明显的复杂性来自于你可以用该结构做的所有事情以及你可以解释它的方式。我不知道您的运营受到哪些限制以及哪些限制是可以协商的,所以我现在最好做的就是在这里快速举例一下可能性。