是否可以将文件添加到git仓库而无需在本地签出?

时间:2011-12-24 16:28:00

标签: git github

目标:将新文件添加到远程git存储库,而不在本地检查整个事情。

为什么: 我正在构建一个将文件添加到用户的git存储库的应用程序。其中一些存储库将是数百兆。有些人很少会被触及。我想避免占用数TB的磁盘空间以保持大型的repos检出不会经常触及,我不想招致检查200Mb repo(大量二进制文件)的不可避免的延迟,以便向其添加一个新文件并将该文件推回原点。

我假设默认的git客户端不能这样做,但我希望有人写了一些可以提交远程仓库的东西(不关心什么语言),而不需要在本地签出整个东西。 Cloud9 IDE是否做了这样的事情?

该应用程序可以通过SSH或GitHub用于oAuthed应用程序调整回购的任何机制完全访问用户git repo。

5 个答案:

答案 0 :(得分:2)

根据存储库的结构,您可以使用稀疏检出来避免下载大文件:

http://schacon.github.com/git/git-read-tree.html#_sparse_checkout

(更多信息请见Checkout subdirectories in Git?

答案 1 :(得分:2)

Git有几种选项可用于浅层克隆和文件路径特定的部分克隆,但这些选项不可推送。

这里的技巧是在结账时使用--lightweight标志 - 在这种情况下,您将能够推送到有限的存储库。

然而,这些解决方案似乎非常不理想......似乎更直观,如果应用程序具有对git存储库的编程访问权限,那么您应该能够创建或要求在安装时创建特定的git项目满足您应用程序的需求,这是空的。

答案 2 :(得分:2)

如果您具有对repos的shell访问权限,则可以创建快速导入文件(有关文件格式的详细信息,请参阅git-fast-import联机帮助页),并在远程存储库中执行git fast-import

如果您没有shell访问权限,那么解决方案会更加黑客。您需要执行以下任务将更改推送到远程仓库:

  • 创建所有文件的内容(=生成新文件的哈希值,找到未更改文件的哈希值[从当前树中获取])
  • 创建树
  • 创建提交
  • 将新文件内容,树和提交推送到远程仓库
  • 将分支 - 移动到服务器

我会从hg-git扩展开始,因为我猜有些代码可以做类似的事情。

答案 3 :(得分:2)

警告:以下答案不再与最近的GIT版本一起使用

(我愿意接受有关如何使用当前git版本进行此操作的建议。)

事实证明,答案非常简单,并证明了Git有多棒。

  • 创建一个全新的git仓库。
  • 添加新文件并将其提交给它。
  • 告诉新的仓库远程仓库的位置(git remote add ...)
  • 推送到远程仓库。

注意:远程仓库必须是裸仓库或将receive.denyCurrentBranch设置为“忽略”或“警告”

这是基于您要添加的文件为新的假设,并且不会与回购中的任何其他文件冲突。

远程存储库的现有内容无关紧要只要您确定不会与任何内容发生冲突。

P.S。感谢发布潜在解决方法的所有人。

答案 4 :(得分:1)

第二个轻量级存储库如何只包含您需要添加的文件,最后一个脚本可以检查存储库并添加文件。该脚本还可以从新的repo中删除消耗的文件,以保持其轻量级。