2011-07-27 12 views
7

Github/Gitoriousに似たいくつかのgitリポジトリを管理する小さなアプリケーションがあります。 Githubはinline file editingを許可しています。誰かがこれをどのように管理しているかについて知っていれば知りたいのですが。Githubはインラインファイル編集をどのように許可しますか? (または裸のgitリポジトリにファイルを追加または編集する方法)

私の最初の考えは、リポジトリの完全なクローンを作成し、提出物を使ってファイルを置き換え、コミットし、プッシュすることでしたが、これはLinuxカーネルのような大きなリポジトリでは非常に高価な操作のようです。

もっと効率的な方法でファイルをベアリポジトリに追加したり編集したりするためのアイデアはありますか?

答えて

8

配管コマンドを使用できます。

現在のHEADを取得し、そこからツリーを取得し、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

私は包括的な例を更新しました。 –

関連する問題