4

ベア リポジトリにファイルがある場合は、git show HEAD:path/to/file.

しかし、作業ツリーを複製したり変更したりせずに、ベア リポジトリに新しいコンテンツを追加することはできますか?

4

1 に答える 1

5

1つのファイルを追加すると、そのコミットには1つのファイルのみが含まれます。別名、何か新しいものを追加し、今では石に設定されています

ベア リポジトリのマスター ブランチの先端に単一ファイルのコミットを追加するには、いくつかの便利な方法があります。

したがって、ブロブ オブジェクトを作成し、それをツリーにアタッチしてから、そのツリー オブジェクトをコミットにアタッチする必要があるようです。

何かをコミットするすべての方法は、それを行うことに要約されます。それは、便利なコマンドが目的にどれだけ適しているかという問題です。git addblob を作成し、インデックスにエントリを作成します。インデックスにあるものに新しいツリーを追加する a と、結果として得られる最上位ツリーのコミットを追加する a と、最新の状態に保つgit commitaを実行します。ベアリポジトリにはコミットがあり、通常は , のようなブランチ (のシンボリック参照) にアタッチされています。. .git write-treegit commit-treegit update-refHEADHEADmaster

したがって、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 年かかります。そう、 ?

いずれにせよ、上記の手順は、コミットごとに少数のファイルに非常に効率的に拡張できます。大量の作業には、より良い方法があります。

于 2015-04-01T17:17:17.353 に答える