【问题标题】:Is there a way to push to a remote Git repository without having to fetch its objects?有没有一种方法可以推送到远程 Git 存储库而无需获取其对象?
【发布时间】:2015-06-23 13:02:04
【问题描述】:

假设我有一个存储在服务器中的大型 Git 存储库,以便多人可以使用它。

我希望能够使用此存储库中的单个文件,即读取、编辑或插入新文件,而不必获取其所有内容,因为它是一个相当大的存储库。

我知道我可以通过使用archive 命令并解压缩结果从特定分支/提交中获取文件,如下所示:

git archive --remote=git:<URL> <tree-ish> <file_name> | tar -x

反过来呢?有没有一种方法可以在给定分支中编辑、插入或删除新文件,甚至可以将新分支推送到远程 Git 存储库,而无需下载其所有内容?

【问题讨论】:

    标签: git


    【解决方案1】:

    据我所知,没有办法做你想做的事。 当您尝试将某些提交推送到远程存储库时,Git 会检测您当前的分支是否落后于其远程分支,在这种情况下它会提示错误:

    ! [rejected]        master -> master (non-fast-forward)
    

    以以下场景为例:

    A - B - C - D (remote master)
         \
          - E     (local master)
    

    如果你在这种情况下尝试推送,Git 会阻止你并建议:

    更新被拒绝,因为您当前分支的尖端落后于其远程分支。在再次推送之前合并远程更改(例如“git pull”)。

    也就是说,您必须获取远程分支,合并更改,然后推送合并的结果。 Git 会阻止您推送可能与远程分支冲突的更改,并要求您在推送之前在本地合并更改(并可能解决冲突)。

    作为旁注,您可以使用git push --force 在 Git 中推送非快进更改(即避免获取远程)。应尽可能避免强制推送,因为它可能会产生一些令人不快的后果,例如使某些人可能已经拉取的提交无法访问。 在前面的场景中,强制推送会导致:

    A - B - E (remote/local master)
    

    如您所见,这会给在之前状态下拉遥控器的人带来一些麻烦。 有关git push --force 后果的详细说明,请参阅this 堆栈溢出问题。

    您还可以在 Git 中执行的操作是获取远程并仅签出一些文件。您可以通过以下方式实现:

    git fetch
    git checkout FETCH_HEAD -- <file-path>
    

    但这并不能解决您的问题,因为它仍然会获取远程并且不允许您在没有合并的情况下推送。

    【讨论】:

    • 这是一个非常清晰且结构良好的答案。非常感谢!
    猜你喜欢
    • 2018-06-24
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 2013-01-27
    • 2018-03-14
    • 1970-01-01
    相关资源
    最近更新 更多