Git 直接提交到裸存储库 一些背景 这适合什么

Git 直接提交到裸存储库 一些背景 这适合什么,git,Git,以协作为中心的web应用程序,提供git托管(如barerepos) 我们想做什么 允许用户将一组文件直接添加到其现有存储库中 我的问题 是否有一种工具或方法可以手动创建只涉及向git repo添加新文件的提交? 我们现在可以使用临时服务器端稀疏签出来实现这一点,但我们希望优化这一过程。Pro Git一章提供了对Git内部的一些深入了解,您可以利用它来创建提交,同时绕过一些正常的Git流程。我使用JGit创建了Git示例,将/rm文件添加到裸repo中。 退房在测试代码中,您可以知道如何使用jg

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

我们想做什么 允许用户将一组文件直接添加到其现有存储库中

我的问题 是否有一种工具或方法可以手动创建只涉及向git repo添加新文件的提交?
我们现在可以使用临时服务器端稀疏签出来实现这一点,但我们希望优化这一过程。

Pro Git一章提供了对Git内部的一些深入了解,您可以利用它来创建提交,同时绕过一些正常的Git流程。

我使用JGit创建了Git示例,将/rm文件添加到裸repo中。 退房在测试代码中,您可以知道如何使用jgitapi进行裸回购操作。

页面中有这样一个例子,但我将尝试简化它

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

如果存在其他人可能同时访问存储库的风险,您可能必须锁定存储库。我将在这里使用
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
#/bin/bash
cd myrepo.git
我的分支=主人
我的文件内容=$'你好,世界\不
#注意,这只是这个脚本的一个锁。其他工具不尊重它。
锁文件-1-r 10锁| |出口1
PARENT_COMMIT=“$(git show ref-s“$MY_BRANCH”)”
#清空索引,不确定是否需要此步骤
git读取树--空
#加载当前树。提交引用很好,它会找到答案的。
git读取树“${PARENT_COMMIT}”
#创建一个blob对象。有些系统使用“shasum”而不是“sha1sum”
#可能要检查它是否已经存在。留作练习。:)
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'undf$/;print compress()“>”对象/${BLOB\u ID:0:2}/${BLOB\u ID:2}”
#现在将其添加到索引中。
git更新索引--添加--cacheinfo 100644“$BLOB_ID”“myfile.txt”
#从新索引创建树
TREE_ID=$(git写入树)
#承诺吧。
NEW_COMMIT=$(回显“我的提交消息”| git提交树“$tree\u ID”-p“$PARENT\u COMMIT”)
#更新分支
git update ref“refs/heads/$MY_BRANCH”“$NEW_COMMIT”“$PARENT_COMMIT”
#完成
rm-f锁

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

您所说的“创建只涉及添加新文件的提交”是什么意思?这和普通的提交有什么不同?听起来你希望有一个web应用程序,人们可以上传文件,而这些文件在后端被提交到git repo?网站使用什么语言?对于您使用的任何语言,您都可能需要找到一个与git交互的库。@rally25rs我们使用的是python wsgi应用程序,但我们并不关心需要使用什么语言或软件包来实现这一点。任何方法都可以作为子流程从站点触发;我的基于git的pastebin工具phorkie需要它。这个问题在我开发平台的其他部分时一直被搁置,但我需要很快重新修改它。如果没有模块或库可以找到,我想开始作为一个轻量级开源项目之一。对于我们的平台来说,使用Python模块是有意义的,但是使用具有多语言绑定的通用格式来实现这一点是有益的。如果有人有兴趣贡献或领导这个小项目,请让我知道。从来没有完全解决这个问题,但祝贺有最好的答案!至于如何从头开始创建树/blob对象,似乎有一个名为
git hash object
的命令可以为您实现这一点,它还可以在传递
-w
标志时将其添加到对象存储中。