2011-07-27 181 views
7

我有一個小應用程序,管理類似於Github/Gitorious的幾個git存儲庫。 Github允許inline file editing,我想知道是否有人對他們如何管理這個有任何想法。Github如何允許內聯文件編輯? (或如何添加或編輯裸Git存儲庫中的文件)

我最初的想法是它會完成存儲庫的完整克隆,使用您的提交來替換文件,提交和推送,但這看起來像是一個非常昂貴的操作,像linux內核這樣的大型存儲庫。

任何想法更有效的方式來添加和編輯文件到裸存儲庫?

回答

8

您可以使用管道命令。

得到你目前的頭,從那裏得到樹,然後你的斑點。

一旦你有了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 

現在我們完成了。


資源:

+1

謝謝 很多!幫助的關鍵字是git'管道'。 –

+0

你可以做一個小例子如何添加一些文件(如/var/test/text.txt)?或覆蓋同一個? – NaN

+0

我更新了一個全面的例子,我希望它會有所幫助。 –