该管道和瓷器页排序有这样一个例子,但我会尽量简化它.
看来裸露的repos仍然有一个索引,可以对其进行操作并将其作为提交.也许有可能从头开始创建树对象,但我不知道具体如何.
如果存在其他人可能同时访问存储库的风险,您可能必须锁定存储库.我只是lockfile
在procmail
这里使用包.
#!/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
Run Code Online (Sandbox Code Playgroud)
如果有git命令来创建blob会很好,但我找不到.perl命令取自另一个问题.
归档时间: |
|
查看次数: |
4204 次 |
最近记录: |