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

21

这个Git问题与关于SVN的另一个问题非常相似。

我有一个包含许多大文件的仓库,并且需要将一个单独的文件添加到其中。在SVN中这很容易实现。

svn import -m "只添加一个文件" 文件名 http://路径/to/svn/repo/文件名

如何在Git中完成这个简单的任务?


据我所知,你不能轻易地这样做。做法是获取仅 HEAD 提交及其所有树对象,这足以生成带有新文件和提交的新树,然后可以将它们推回去 - 但我不知道是否有内置的 git 客户端支持来执行此操作。我认为你最好的选择就是克隆存储库,这比担心找到更好的方法要快。 - Rup
可能最终我会做这件事,但会拖慢我的速度。该仓库包含一系列非常庞大的二进制文件。因此,即使使用 --depth=0,这也将是一个痛苦的过程。 - sscarduzio
@sscarduzio 如果只是添加一个文件,您可以使用Github界面进行操作。 - heinrich5991
1
对于我们这些在带宽和存储空间匮乏的世界中的人来说,仅仅克隆并不是一个选择。 - Andrew
3个回答

6

对于GitHub(而不是git本身),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等工具将其发送到https://api.github.com/repos/:owner/:repo/contents/:path。如果成功,您将获得返回的JSON响应,其中包括创建文件的GitHub URL。也可以在不克隆的情况下进行更新:https://developer.github.com/v3/repos/contents/#update-a-file

3

该存储库包含一系列相当臃肿的二进制文件。

这不是Git存储库的设计目的,如我在这里所解释的那样。

你不能在没有先获取的情况下推送某些东西,因此,除非你的存储库托管在支持通过其Web界面添加文件的服务中(像GitHub一样,如评论所述heinrich5991),否则你将无法导入单个文件。

一个替代方案是有一个专用服务器随时托管完整副本的存储库,你可以在其中添加一个文件,然后从中推送到目标存储库。


1
我按照建议解决了这个问题:克隆到服务器,将新文件通过 scp 传输到服务器,git add、commit,再推送到 Github。 我的“庞大二进制文件”是依赖的 JAR 包。 由于这是我用于部署的仓库,所以无法使用 Maven 将它们放在原位。 我认为这个仓库可以尽快迁移到 SVN 上。 - sscarduzio

3

无法这样做。我刚刚进行了以下测试:

  1. mkdir hello_independent (注意:“hello”是我以前的存储库的名称)
  2. git init (注意:在此处创建一个空白存储库)
  3. git remote set-url origin https://github.com/solio/GitPractice.git (注意:将本地存储库指向远程存储库。)
  4. vim newfilefromindependentfolder.md (注意:添加一个新文件)
  5. git add --a
  6. git commit -m "test commit from independent folder."
  7. git push origin master (注意:此操作是关键)

它会显示以下错误:(很抱歉,我没有10个声望所以无法上传我的操作和提示消息的图像)

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


1
作为一个贫困的第三世界国家居民,这是我在致力于Git之前希望知道的一个主要缺点。我该如何向Git社区提出问题? - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接