首页 > 解决方案 > Git:将不同的文件推送到各种遥控器

问题描述

我正在使用 git 扩展。我确实有各种分支机构,并且已经设置了各种遥控器。存储库中有超过 10k 个文件。现在我只需要将几个特定文件从这些遥控器(bitbucket)推送到一个。这些特定文件将定期推送。最好的工作流程是什么?

标签: gitgit-extensions

解决方案


Git 不推送文件。Git 推送提交。现在,提交确实包含文件。但这是一揽子交易:将提交想象成装满家具的卡车。您不能只提供一张茶几或椅子。整辆卡车必须去某个地方。(不要过分强调这个类比,否则它会分崩离析。)

要按名称将给定的提交推送到某个远程,请运行:

git push <remote-name> <commit-specifier>:<name>

您这边的commit-specifier部分可以是分支名称、标签名称、原始提交哈希或其他任何内容。remote-name可以是您的任何远程名称。name冒号右侧的部分是remote 中的名称,任何使用该其他 Git 存储库的人(在远程上)都将通过它找到您使用您发送的提交commit-specifier来选择提交。

因为提交历史,如果远程没有提交,发送提交将自动发送所有早期提交。他们将得到每一个承诺,包括那个承诺。如果遥控已经拥有它们——这很常见——它们就不需要这些提交。

Git 协议使两个 Git 能够相互交谈并找出他们有哪些提交。当接收 Git 说我已经提交a123456到发送 Git 时,通知发送 Git 接收者不仅有那个提交,还有所有导致并包括那个提交的提交,因为提交是历史,我们总是1发送所有完整历史所需的提交。

发送 Git 将看到接收 Git 不仅包含所有这些提交,还包含该提交中所有文件。因此,发送者可以通过完全忽略任何匹配的文件来压缩他发送的任何提交,并将新文件压缩为delta 编码的指令,告诉接收者如何从他已有的文件中构建这些文件。这些压缩指令非常适用于纯文本文件。对于预压缩的二进制文件,例如 jpeg 图像,它们往往效果不佳。


1此规则的例外是浅存储库,这会使事情变得复杂。一个用git clone --depth. (Bitbucket 上的接收存储库不会是浅层存储库。)


推荐阅读