【问题标题】:How does Github allow for inline file editing? (Or how to add or edit files in a bare git repository)Github 如何允许内联文件编辑? (或如何在裸 git 存储库中添加或编辑文件)
【发布时间】:2011-10-14 08:02:30
【问题描述】:

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

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

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

【问题讨论】:

    标签: git github grit


    【解决方案1】:

    您可以使用管道命令。

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

    获得 blob 后,您可以将内容放入文本框中。完成后,您只需对新 blob 进行哈希处理,创建新树、新提交和 tadaam。它是“推”的。

    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 'plumbing'。
    • 你能举一个小例子如何添加一些文件(如/var/test/text.txt)吗?还是覆盖同一个?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 2015-06-11
    • 1970-01-01
    • 2012-05-30
    • 2017-07-10
    相关资源
    最近更新 更多