ベア リポジトリにファイルがある場合は、git show HEAD:path/to/file
.
しかし、作業ツリーを複製したり変更したりせずに、ベア リポジトリに新しいコンテンツを追加することはできますか?
1つのファイルを追加すると、そのコミットには1つのファイルのみが含まれます。別名、何か新しいものを追加し、今では石に設定されています
ベア リポジトリのマスター ブランチの先端に単一ファイルのコミットを追加するには、いくつかの便利な方法があります。
したがって、ブロブ オブジェクトを作成し、それをツリーにアタッチしてから、そのツリー オブジェクトをコミットにアタッチする必要があるようです。
何かをコミットするすべての方法は、それを行うことに要約されます。それは、便利なコマンドが目的にどれだけ適しているかという問題です。git add
blob を作成し、インデックスにエントリを作成します。インデックスにあるものに新しいツリーを追加する a と、結果として得られる最上位ツリーのコミットを追加する a と、最新の状態に保つgit commit
aを実行します。ベアリポジトリにはコミットがあり、通常は , のようなブランチ (のシンボリック参照) にアタッチされています。. .git write-tree
git commit-tree
git update-ref
HEAD
HEAD
master
したがって、git の便利なコマンドは、すでにほぼ正確に目的を果たしています。特にファイルが 1 つだけの場合、これは非常に簡単になります。
たとえば、ファイルが に表示され~server/data/logs/
、配布に使用している裸のリポジトリが にあり~server/repo.git
、コミットされたファイルがリポジトリにあるようにdata/logs
し、常に最新のログファイルをコミットしたいとします。
#!/bin/sh
cd ~server
# supply locations git ordinarily does on its own in working i.e. non-bare repos:
export GIT_DIR=$PWD/repo.git # bare repos don't have defaults for these
export GIT_WORK_TREE=$PWD # so supply some to suit our purpose
export GIT_INDEX_FILE=$GIT_DIR/scratch-index # ...
# payload: commit (only) the latest file in data/logs:
git read-tree --empty # make the index all pretty, and
git add data/logs/`ls -1t data/logs|sed q` # everything's ordinary from here - add and
git commit -m'new logfile' # commit
git read-tree
コミットされたツリーからインデックス エントリをロードします。これは、チェックアウト、マージ、リセットの根底にあるものであり、おそらく私が忘れている他のいくつかの atm です。ここでは、空のインデックスを開始したいだけなので、--empty
.
すべてのマシンですでに利用可能なツールを使用しながら、プッシュ/プル/リモートを使用してデータを同期します
時間の経過とともに「数百万」のファイルがあると言いましたが、その完全な履歴を配布したくない場合は、rsync
私が収集したように、より良い賭けかもしれないとすでに疑っています。しかし、一度に 1 つずつ、1 分間に 1 つの新しいファイルを作成すると、わずか 100 万を蓄積するのに 2 年かかります。そう、 ?
いずれにせよ、上記の手順は、コミットごとに少数のファイルに非常に効率的に拡張できます。大量の作業には、より良い方法があります。