我们有一个公共存储库,每个人都可以推送。有时,我们希望仅在不拉动整个远程对象和推送整个合并的本地对象的情况下拉入和推入单个文件。我知道推送必须是快进的,我们可以快进单个文件吗?
这可能吗?如果没有,为什么(通过设计?)?
答案 0 :(得分:3)
首先,您正在滥用Git术语。 ref 或 reference 只是一个名称,例如refs/heads/master
(分支名称master
的全名)或{{1} }(标签refs/tags/v1.2
的全名)。
下一步:v1.2
不推送文件。 git push
发送的是:
git push
)。由接收服务器决定是否遵守这些请求或命令。更新分支名称(--force
名称空间中的引用)的请求的默认值是,仅当它是快速操作时,才服从礼貌的请求,并服从任何命令(任何强制更新) 。 文件在这里完全无关。当且仅当新提交哈希ID具有旧提交哈希ID作为祖先时,分支名称更新才是快进操作。 1
要推送单个参考,只需执行以下操作:
refs/heads/
要推送多个,只需执行以下操作:
git push <remote> <local-name>:<remote-name>
(在git push <remote> <l1>:<r1> <l2>:<r2> ... <ln>:<rn>
中,在冒号后省略名称意味着另一个Git应该使用与本地Git中相同的名称。)
任何提交随附的文件是提交快照中的文件。由于您只能推送 commits (不是文件),因此无法推送文件。
(当然,您可以使用除Git之外的其他 来将文件发送到服务器,并让服务器将文件更新到位。但是在这种情况下,无需询问完全是Git!)
1 Git保持由 D 取代的 A 循环 G rap或DAG提交(实际上是所有对象,但这里是提交)。推送的结果是DAG的更改。如果更改是纯附加项,则不会丢失任何提交。根据定义,此类更新是快进,因此是允许的。如果更改导致某些提交无法从更新的引用中获取,则更改定义为非快进,因此默认情况下拒绝礼貌的请求更新。
非快速转发更新实际上是否丢失提交取决于这些提交是否可以通过其他外部名称访问。这很难计算-并非不可能,只是通过查看正在更新的一个引用不会立即变得显而易见。因此,默认情况下要求快速更新的设计原则。