【问题标题】:Commit directly to a bare repository直接提交到裸存储库
【发布时间】:2012-03-12 15:50:51
【问题描述】:

一些上下文

这适合什么

一个以协作为中心的 Web 应用程序,提供 git 托管(如 bare repos)

我们想做什么

允许用户将一组文件直接添加到他们现有的存储库中。

我的问题

是否有工具或方法可以手动创建只涉及将新文件添加到 git repo 的提交?

我们现在可以使用临时的服务器端稀疏签出来做到这一点,但我们希望优化这个过程。

【问题讨论】:

  • 你是什么意思“创建一个只涉及添加新文件的提交”?这与普通提交有何不同?
  • 听起来你想要一个网络应用程序,人们可以在其中上传文件,并且这些文件在后端被提交到 git repo?网站是什么语言的?您可能需要找到一个库来与您使用的任何语言的 git 交互。
  • @rally25rs 我们正在使用 python wsgi 应用程序,但我们并不关心我们需要使用什么语言或包来执行此操作。任何方法都可以作为子流程从站点触发。
  • 我也对这个话题感兴趣;我需要它用于 phorkie,我的基于 git 的 pastebin 工具。
  • 这个问题一直在我处理平台的其他部分时被搁置,但我需要尽快重新解决它。如果找不到模块或库,我想将其作为轻量级开源项目开始。对于我们的平台而言,将其作为 Python 模块是有意义的,但以具有多种语言绑定的通用格式来执行此操作将是有益的。如果有人有兴趣贡献或领导这个小项目,请告诉我。

标签: git


【解决方案1】:

plumbing and porcelain 页面有一个这样的例子,但我会尽量简化它。

似乎裸仓库仍然有一个索引,可以对其进行操作并提交。可能也可以从头开始创建树对象,但我不知道具体如何。

如果存在其他人可能同时访问它的风险,您可能必须锁定存储库。我将在这里简单地使用procmail 包中的lockfile

#!/bin/bash
cd myrepo.git

MY_BRANCH=master
MY_FILE_CONTENTS=$'Hello, world!\n'

# Note this is just a lock for this script. It's not honored by other tools.
lockfile -1 -r 10 lock || exit 1

PARENT_COMMIT="$(git show-ref -s "$MY_BRANCH")"

# Empty the index, not sure if this step is necessary
git read-tree --empty

# Load the current tree. A commit ref is fine, it'll figure it out.
git read-tree "${PARENT_COMMIT}"

# Create a blob object. Some systems have "shasum" instead of "sha1sum"
# Might want to check if it already exists. Left as an excercise. :)
BLOB_ID=$(printf "blob %d\0%s" $(echo -n "$MY_FILE_CONTENTS" | wc -c) "$MY_FILE_CONTENTS" | sha1sum | cut -d ' ' -f 1)
mkdir -p "objects/${BLOB_ID:0:2}"
printf "blob %d\0%s" $(echo -n "$MY_FILE_CONTENTS" | wc -c) "$MY_FILE_CONTENTS" | perl -MCompress::Zlib -e 'undef $/; print compress(<>)' > "objects/${BLOB_ID:0:2}/${BLOB_ID:2}"

# Now add it to the index.
git update-index --add --cacheinfo 100644 "$BLOB_ID" "myfile.txt"

# Create a tree from your new index
TREE_ID=$(git write-tree)

# Commit it.
NEW_COMMIT=$(echo "My commit message" | git commit-tree "$TREE_ID" -p "$PARENT_COMMIT")

# Update the branch
git update-ref "refs/heads/$MY_BRANCH" "$NEW_COMMIT" "$PARENT_COMMIT"

# Done
rm -f lock

如果有 git 命令来创建 blob,那就太好了,但我没有找到。 perl 命令取自another question

【讨论】:

  • 至于如何从头开始创建树/blob 对象,似乎有一个名为git hash-object 的命令可以为您做到这一点,并且在传递时它也会将其添加到对象存储中-w 标志。 git-scm.com/docs/git-hash-object
【解决方案2】:

Pro Git 的 "Plumbing and Porcelain" 章节提供了对 Git 内部的一些见解,您可以利用它来创建提交,同时绕过一些正常的 Git 过程。

【讨论】:

  • 从未完全解决此问题,但恭喜您获得最佳答案!
【解决方案3】:

我使用 JGit 将 git add/rm 文件的示例创建到裸仓库中。 查看https://github.com/junoyoon/git-online-commit-sample。在测试代​​码中,您可以了解如何使用 JGit API 进行裸 repo 操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-01
    • 2011-06-05
    • 2018-08-03
    • 2011-11-08
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多