gpt4 book ai didi

git - 直接提交到裸存储库

转载 作者:IT王子 更新时间:2023-10-29 01:01:37 27 4
gpt4 key购买 nike

一些背景

这适合什么

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

我们想做什么

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

我的问题

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

我们现在可以使用临时服务器端稀疏 checkout 来执行此操作,但我们希望优化此过程。

最佳答案

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

看起来 bare repos 仍然有一个索引,可以对其进行操作并进行提交。也可能从头开始创建树对象,但我不知 Prop 体如何。

如果存在其他人可能同时访问它的风险,您可能必须锁定存储库。我将在这里简单地使用 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

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

关于git - 直接提交到裸存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9670302/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com