git - Github 如何允许内联文件编辑? (或者如何在裸 git 存储库中添加或编辑文件)

标签 git github grit

我有一个小型应用程序,可以管理多个类似于 Github/Gitorious 的 git 存储库。 Github 允许 inline file editing ,我想知道是否有人知道他们如何管理它。

我最初的想法是它会完全克隆存储库,使用您的提交来替换文件、提交和推送,但是对于像 linux 内核这样的大型存储库,这似乎是一个非常昂贵的操作。

关于向裸存储库添加和编辑文件的更有效方法有什么想法吗?

最佳答案

您可以使用管道命令。

获取当前的 HEAD,从那里获取树,然后获取 blob。

获得 blob 后,您可以将内容放入文本框中。完成后,您只需散列新 blob、创建新树、新提交和 tadaam。它是“push ”的。

PS:请记住您在一个裸存储库中,因此请检查您使用的每个命令都不需要索引或工作目录。


这里有一个逐步示例。

首先我们获取当前文件内容:

> git cat-file -p HEAD:var/test/text.txt
test

我们对该内容稍作修改,现在可以推送新内容。 为了保存该内容,我们将对其进行哈希处理:

> git hash-object -t blob -w var/test/text.txt
9764d221e6b50063b83c0268544c5d5b745ec9c5

这将保存它,并返回该对象 (blob) 的 sha-1,下一步是创建一个新文件夹 test,其中将包含我们的 text.txt 文件。但首先让我们看看当前的 test 文件夹是什么样的:

> git ls-tree HEAD:var/test
100644 blob 9daeafb9864cf43055ae93beb0afd6c7d144bfa4    text.txt

所以我们在这里要做的是用新的 (9764d22...) 替换以前的 SHA-1 (9daeafb...) 并生成基于它的新树(注意 \t)。

> echo -e "100644 blob 9764d221e6b50063b83c0268544c5d5b745ec9c5\ttext.txt" | git mktree
b7788f9e8e9a24be31188167a6a0bc1de9e41d24

太好了,现在我们有了新文件 text.txt 和父文件夹 test,我们现在需要 var

> git ls-tree HEAD:var
040000 tree 9bfb857f532d280ecd7704beb40a2ea4ba332f5a    test

> echo -e "040000 tree b7788f9e8e9a24be31188167a6a0bc1de9e41d24\ttest" | git mktree
536f33626a47138499fade7df6d02327f75d80be

现在我们需要 var 的父级(这是我们存储库的根目录):

> git ls-tree HEAD
040000 tree 31a6ee5e7d14a0569721632a05234185a109d6bd    var

> echo -e "040000 tree 536f33626a47138499fade7df6d02327f75d80be\tvar" | git mktree
7db3d6bc14cce98ff89ccc285b9d17965f5ca92b

完成了,我们的树准备好了。唯一缺少的是实际提交:

> git commit-tree -p HEAD -m "commit message" 7db3d6bc14cce98ff89ccc285b9d17965f5ca92b
4aa2de2cf9e3e4f5470bcd1ee1e83ef6e4025eaf

但它还没有准备好,现在我们希望提交成为 HEAD,所以最后一步是:

> git update-ref HEAD 4aa2de2cf9e3e4f5470bcd1ee1e83ef6e4025eaf

现在我们完成了。


资源:

关于git - Github 如何允许内联文件编辑? (或者如何在裸 git 存储库中添加或编辑文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6846067/

相关文章:

git - 如何在 2.27+ 中使用 git sparse-checkout

ios - Cocoapods - 为私有(private) iOS 存储库创建 pod

ruby - grit - 尝试将文件添加到 git repo 而不是将它们写入文件系统

git - 如何检测两个 git 存储库之间的冲突。

git - 使用 gitignore 清理 Git 存储库

django - 我应该使用 git 来部署网站吗?

ios - 如何从我的 podfile 中找到 GitHub 项目?

ruby - 我可以获取以 grit 发出的 git clone 命令的进度,输出到标准输出吗?

git - 多次提交后添加 gitignore

git - 如何使用带有 git 命令的 travis merge 到另一个分支?