我該如何手動構建使用git散列對象的git commit對象? 我現在可以使用blob,它的文檔說它可以使用-t構建不同的對象,但是如何使用-t構建一個提交?用git hash-object構建git commit對象?
回答
以下腳本的完整和工作的例子,創建了一個commit
對象而沒有運行git commit
:
mkdir project
cd project
git init
hash=`echo -n "" | git hash-object -w --stdin`
tree=`echo -e "100644 blob ${hash}\temptyfile" | git mktree`
commit=`echo -e "yourname\[email protected]\n2013 12:20:15 +0200\ncommittername\[email protected]\n2013 10:13:15 +0200" | git commit-tree ${tree}`
git update-ref refs/heads/master ${commit}
要驗證該腳本創建一個提交包含一個空文件,運行:
git checkout --
git log --oneline
#2abbdc2 yourname [email protected] 2013 12:20:15 +0200 committername [email protected]
編輯:固定的和改進的
爲了讀者的利益:
的accepted answer from Arialdo Martini是完全正確的,並說明如何創建一個空的git
回購適當管道命令。請注意,他的變型適用於bare
倉庫,太(你可以在git
-dir創建emptyfile
沒有不良副作用)。
這裏的答案將其歸納爲一個小小的調整腳本:該文件的內容取自「stdin」,該文件可以放入工作樹的子目錄中。
腳本git-init-with-file-from-stdin.sh new-git-workdir filename 'commit message'
:
#!/bin/bash
mkdir "$1" &&
cd "$1" &&
git init &&
dir="$(dirname "$2")" &&
name="$(basename "${2:-dummyfile}")" &&
obid="$(git hash-object -w --stdin)" &&
treeid="$(git mktree < <(printf '100644 blob %q\t%q\n' "$obid" "$name"))" &&
if [ . = "$dir" ]; then git read-tree -i "$treeid";
else git read-tree --prefix="$dir/" -i "$treeid"; fi &&
git commit -m "${3:-automatic commit}" &&
git reset --hard
解釋呼叫
./git-init-with-file-from-stdin.sh newgitdir path/to/file <<< "hellOw W0rld"
mkdir "$1"
,cd "$1"
,git init
創建新git
worktree和initiailizes它。它以第一個參數命名(這裏是newgitdir
),假定它命名爲現有路徑中不存在的目錄。dir="$(dirname "$2")"
,name="$(basename "${2:-dummyfile}")"
提取路徑,第二個參數,它定義了想要的文件名的名稱的一部分。該路徑與創建的git
-workdir相關。請注意,該參數不得以/
開頭,否則命令將失敗。這裏dir=path/to
和name=file
。如果離開,新文件在git
-workdir的頂部被稱爲「dummyfile」。然後存儲與在變量
obid
從stdin
讀入新對象的git
回購並存儲SHA(對象ID)的信息的對象。在該示例中,內容是hellOw W0rld
,後跟NL
。git mktree < <(printf '100644 blob %q\t%q\n' "$obid" "$name")
幾乎與printf '100644 blob %q\t%q\n' "$obid" "$name" | git mktree
相同,並創建一個合適的git-tree。100644
是通常的文件模式。如果你想創建可執行文件,你需要在這裏100755
。treeid="$(
...)"
然後分配給這個給定的變量treeid
if [ . = "$dir" ]; then git read-tree -i "$treeid";
這讀取這個新創建的樹到git
臨時區域後提交。但是,這種情況下,該文件應該直接在git
-worksdir中。else git read-tree --prefix="$dir/" -i "$treeid"; fi
是相同的情況下,當你想把它放到git
-workdir的子目錄中。好的是,git
會自動爲您創建所有中間目錄節點。 (可悲--prefix="./"
產生錯誤。)git commit -m "${3:-automatic commit}"
然後使用公知的提交來創建提交git reset --hard
然後同步的git
-worktree與最新提交。
更改爲bare
變種:
一切工作類似,只不過
git commit
(這需要一個WORKDIR)和git reset
(你不需要它)。更換
git init &&
與
git init --bare &&
也如被看見在接受的答案相似序列代替
git commit -m "${3:-automatic commit}" && git reset --hard
:
commitid="$(git commit-tree "$(git write-tree)" <<< "${3:-automatic commit}")" && git update-ref "refs/heads/master" "$commitid"
備註:
這需要在這裏
bash
,這意味着,it works for Windows 10,太
- 1. git commit -m vs git commit -am
- 2. jenkins - 觸發基於git commit的構建
- 3. git-svn dmitmiting git commit
- 4. 結合git add。和git commit
- 5. (git add -A後跟git commit)和git commit -a之間的區別?
- 6. SLOC在git commit
- 7. Git commit問題
- 8. 撤消git commit
- 9. Git revert lastet commit
- 10. git commit integrity
- 11. Git submodule commit
- 12. Git commit date
- 13. Git pre-commit hook
- 14. Git commit命令
- 15. Aptana 3 git commit
- 16. Git commit patches
- 17. Git commit id lost
- 18. git find fat commit
- 19. TDD&Git commit comments
- 20. git commit problems
- 21. git commit - 格式?
- 22. Git post commit mails
- 23. git commit directory
- 24. 刪除git commit
- 25. 如何使用git? git-commit?混帳推?
- 26. 爲什麼我必須使用「git commit -a」而不是「git commit」?
- 27. 瞭解何時使用git commit -m和git commit -am
- 28. git commit對目錄不起作用
- 29. Visual Studio 2015 git commit文件夾結構
- 30. 使用Hudson來構建特定的git commit
你需要做一些樹對象創建一個提交對象。你可以使用索引文件和'write-tree'或者'mktree'。如果你真的想要,你可以使用'hash-object',但對我來說似乎很麻煩。 –
你知道如何使用散列對象來做到這一點嗎?我知道git commit-tree的存在,但是你可以使用git hash-object來做到這一點嗎? – user2291590
您只需將一個有效的樹管道輸送給它,就像您使用其他任何對象(如blob)一樣。 –