如何在不首先克隆整个 repo 的情况下将文件添加到远程 Git repo (Github)

Posted

技术标签:

【中文标题】如何在不首先克隆整个 repo 的情况下将文件添加到远程 Git repo (Github)【英文标题】:How do I add file to remote Git repo (Github) without cloning the whole repo first 【发布时间】:2013-11-06 07:40:03 【问题描述】:

这个 Git 问题与 another one 关于 SVN 的问题非常相似。

我有一个充满大文件的仓库,我需要向其中添加一个文件。这在 SVN 中曾经非常简单。

svn import -m "Adding just a file" file_name http://path/to/svn/repo/file_name

如何在 Git 中实现这个简单的任务?

【问题讨论】:

AFAIK 你不容易。这样做的方法是只获取 HEAD 提交及其所有树对象,这些信息足以使用您的新文件和提交生成新树,然后您可以将它们推回 - 但我不知道内置 git 客户端支持做到这一点。你最好的选择是克隆我认为的存储库 - 这比担心找到更好的方法要快。 可能我最终会这样做,但会减慢我的速度。该 repo 包含一组相当丰富的二进制文件。所以即使使用 --depth=0 也会很痛苦。 @sscarduzio 如果只是添加单个文件,可以使用 Github 接口。 对于我们这些缺乏带宽和存储空间的人来说,仅仅克隆并不是一种选择。 【参考方案1】:

对于GitHub(不是git 本身),the GitHub API 提供了一种无需克隆即可创建文件的方法:

https://developer.github.com/v3/repos/contents/#create-a-file

PUT /repos/:owner/:repo/contents/:path

# Parameters #
----------------------------------------------------------------
Name     Type    Description
------   ------  -----------------------------------------------
path     string  Required. The content path.
message  string  Required. The commit message.
content  string  Required. The new file content, Base64-encoded.
branch   string  Branch name. Default: repo's default branch.

最小的 JSON 输入示例:


  "message": "my commit message",
  "content": "bXkgbmV3IGZpbGUgY29udGVudHM="

所以你可以编写一个脚本来对文件内容进行base64编码,然后让它使用curl或类似的方式将上面的一些JSON发送到https://api.github.com/repos/:owner/:repo/contents/:path

如果成功,您将获得 a JSON response back,包括所创建文件的 GitHub URL。

不克隆也可以更新:https://developer.github.com/v3/repos/contents/#update-a-file

【讨论】:

【参考方案2】:

repo 包含一组相当丰富的二进制文件

这不是 git repo 的设计目的,如 I explained here。

你不能在没有先获取的情况下推送一些东西,所以除非你的 repo 托管在支持通过其 Web 界面添加文件的服务中(like GitHub,commented by @987654324 @),您将无法只导入一个文件。

另一种方法是让专用服务器始终托管您的存储库的完整副本,您可以向其中添加一个文件,然后您可以从中推送到目标存储库。

【讨论】:

我按照建议解决了这个问题:克隆到服务器,scp 新文件到服务器,git add,提交,推送到 Github。我的“胖二进制文件”是依赖 jars。由于这是我用于部署的 repo,我不能使用 maven 将它们拉到位。我认为这个 repo 可以尽快安全地迁移到 SVN。【参考方案3】:

没有办法做到这一点。我刚刚做了一个测试:

    mkdir hello_independent(注意:“hello”是我之前的仓库名称) git init(注意:这里创建一个空白的仓库) git remote set-url origin https://github.com/solio/GitPractice.git(注意:设置本地仓库指向远程仓库。) vim newfilefromindependentfolder.md(注意:添加新文件) git add --a git commit -m "test commit from independent folder." git push origin master(注意:这个操作是关键)

它会显示这个错误:(对不起,我无法上传我的操作图像和没有10声望的提示消息)

这是我对消息的理解:当我这样做时,有两个不同的独立工作流,它们没有任何关系。因此,当您要将独立文件提交到远程存储库时,您必须合并本地存储库和远程存储库。所以解决这个问题的最好方法是 git clone 远程仓库。

【讨论】:

作为一个贫穷的第三世界人,这是我希望在使用 git 之前就知道的一个主要缺点。如何向 git 社区提出问题?

以上是关于如何在不首先克隆整个 repo 的情况下将文件添加到远程 Git repo (Github)的主要内容,如果未能解决你的问题,请参考以下文章

如何在不破坏滚动功能的情况下将 UIImage 添加到 UIScrollView?

SSAS - 是不是可以在不重新部署整个多维数据集的情况下将属性添加到现有维度

如何在不带整个库的情况下将场景或影片剪辑导出为 SWF?

如何在不覆盖以前数据的情况下将数据添加到 XML 文件(C#)

如何在不上传 favicon 文件的情况下将 favicon 添加到 Google colab 上的 Flask 路由?

如何在不使用画布的情况下将整个 div 数据转换为图像并将其保存到目录中?