我有一個小應用程序,管理類似於Github/Gitorious的幾個git存儲庫。 Github允許inline file editing,我想知道是否有人對他們如何管理這個有任何想法。Github如何允許內聯文件編輯? (或如何添加或編輯裸Git存儲庫中的文件)
我最初的想法是它會完成存儲庫的完整克隆,使用您的提交來替換文件,提交和推送,但這看起來像是一個非常昂貴的操作,像linux內核這樣的大型存儲庫。
任何想法更有效的方式來添加和編輯文件到裸存儲庫?
我有一個小應用程序,管理類似於Github/Gitorious的幾個git存儲庫。 Github允許inline file editing,我想知道是否有人對他們如何管理這個有任何想法。Github如何允許內聯文件編輯? (或如何添加或編輯裸Git存儲庫中的文件)
我最初的想法是它會完成存儲庫的完整克隆,使用您的提交來替換文件,提交和推送,但這看起來像是一個非常昂貴的操作,像linux內核這樣的大型存儲庫。
任何想法更有效的方式來添加和編輯文件到裸存儲庫?
您可以使用管道命令。
得到你目前的頭,從那裏得到樹,然後你的斑點。
一旦你有了blob,你可以把內容放在一個文本框中。完成後,你只需要散佈新的blob,創建新的樹,新的提交和tadaam。這是「推」。 PS:記住你是在一個裸倉庫中,所以檢查你使用的每個命令都不需要索引或工作目錄。
因爲這裏已經提出了一個循序漸進的例子。
首先我們得到當前文件的內容:
> git cat-file -p HEAD:var/test/text.txt
test
我們盡我們稍加修改就這些內容,現在有一個新的內容準備好推。 要保存的內容我們要散列它:
> git hash-object -t blob -w var/test/text.txt
9764d221e6b50063b83c0268544c5d5b745ec9c5
這將保存它,並返回對象(BLOB)的SHA-1,非常下一步在於創建一個新的文件夾test
這將包含我們的text.txt
文件。但是,首先讓我們來看看什麼是當前test
文件夾的樣子:
> git ls-tree HEAD:var/test
100644 blob 9daeafb9864cf43055ae93beb0afd6c7d144bfa4 text.txt
所以,我們要在這裏做的,就是用新的(9764d22...
)取代以前的SHA-1(9daeafb...
)並生成新的樹基於此(請注意\t
)。
> echo -e "100644 blob 9764d221e6b50063b83c0268544c5d5b745ec9c5\ttext.txt" | git mktree
b7788f9e8e9a24be31188167a6a0bc1de9e41d24
大,所以現在我們有新的文件text.txt
和父文件夾test
,我們現在需要var
。
> git ls-tree HEAD:var
040000 tree 9bfb857f532d280ecd7704beb40a2ea4ba332f5a test
> echo -e "040000 tree b7788f9e8e9a24be31188167a6a0bc1de9e41d24\ttest" | git mktree
536f33626a47138499fade7df6d02327f75d80be
現在我們需要的var
父(這是我們倉庫的根目錄):
> git ls-tree HEAD
040000 tree 31a6ee5e7d14a0569721632a05234185a109d6bd var
> echo -e "040000 tree 536f33626a47138499fade7df6d02327f75d80be\tvar" | git mktree
7db3d6bc14cce98ff89ccc285b9d17965f5ca92b
而且它的完成,我們的樹已準備就緒。唯一缺少的是實際的承諾:
> git commit-tree -p HEAD -m "commit message" 7db3d6bc14cce98ff89ccc285b9d17965f5ca92b
4aa2de2cf9e3e4f5470bcd1ee1e83ef6e4025eaf
但還沒有準備好,現在我們想的承諾是HEAD,所以最後一步是:
> git update-ref HEAD 4aa2de2cf9e3e4f5470bcd1ee1e83ef6e4025eaf
現在我們完成了。
資源:
謝謝 很多!幫助的關鍵字是git'管道'。 –
你可以做一個小例子如何添加一些文件(如/var/test/text.txt)?或覆蓋同一個? – NaN
我更新了一個全面的例子,我希望它會有所幫助。 –