【问题标题】:Git push only one fileGit只推送一个文件
【发布时间】:2018-07-12 14:31:04
【问题描述】:

我们有一个公共回购,每个人都在推动。我们有时想要拉和推送单个文件,而不是拉整个远程并推送整个合并的本地文件。我知道推送必须是快进,我们可以快进一个文件吗?

这可能吗?如果不是,为什么(按设计?)?

【问题讨论】:

    标签: git push


    【解决方案1】:

    首先,您误用了 Git 术语。 refreference 只是一个名称,例如refs/heads/master(分支名称master 的全称)或refs/tags/v1.2(分支名称的全称标签v1.2)。

    下一步:git push 不推送文件git push 发送的是:

    • 提交和/或注释标签,以及所有其他需要的对象;
    • 一系列参考更新请求(默认)或命令 (--force)。

    接收服务器决定是否服从这些请求或命令。更新分支名称的请求(refs/heads/ 命名空间中的引用)的默认设置是当且仅当它是快进操作时才服从礼貌请求,并且服从任何命令(任何强制更新)。 文件在这里完全不相关。当且仅当新提交哈希 ID 以旧提交哈希 ID 作为祖先时,分支名称更新才是快进操作。1

    要推送单个引用,只需这样做:

    git push <remote> <local-name>:<remote-name>
    

    要推送多个,只需这样做:

    git push <remote> <l1>:<r1> <l2>:<r2> ... <ln>:<rn>
    

    (在git push 中省略冒号后的名称意味着另一个 Git 应该使用您在本地 Git 中使用的相同名称。)

    任何提交附带的文件是提交快照中的文件。由于您只能推送提交(而不是文件),因此无法推送文件。

    (当然,您可以使用 Git 以外的其他方式 将文件发送到服务器,并让服务器更新文件。但在这种情况下,无需询问Git !)


    1Git 维护一个 Directed A循环 Graph 或 DAG 提交(实际上所有对象,但提交是这里感兴趣的对象)。推送的结果是对 DAG 的更改。如果更改是纯添加,则不会丢失任何提交。根据定义,这样的更新是快进,因此是允许的。如果更改导致某些提交变得无法从更新的引用中访问,则根据定义,更改是 非快进,因此默认拒绝礼貌请求更新。

    非快进更新是否真的丢失提交取决于这些提交是否可以通过其他外部名称访问。这更难计算 - 并非不可能,只是通过查看正在更新的一个参考并不立即显而易见。因此默认要求快进更新的设计原则。

    简而言之,Git 真的在做graphtheory

    【讨论】:

      猜你喜欢
      • 2011-06-13
      • 2021-08-25
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      • 2015-01-16
      • 2017-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多