有没有办法推送到远程Git存储库而无需获取其对象?

时间:2015-06-23 13:02:04

标签: git

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

我希望能够处理来自此存储库的单个文件,即读取,编辑或插入新文件,而无需获取其所有内容,因为它是一个相当大的存储库。

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

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

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

1 个答案:

答案 0 :(得分:3)

据我所知,没有办法做你想做的事。 当您尝试将某些提交推送到远程存储库时,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>

然而,这并不能解决您的问题,因为它仍然会取出遥控器,并且不允许您在没有合并的情况下进行推送。