2

Git に保存したい Linux システムを組み込みました。システムに Git をインストールし、Git データ (ベア リポジトリ) を保存するための追加の USB ドライブをマウントします。次のようなコマンドを使用して、リモート リポジトリにコミットしてプッシュすることに問題はありません。

cd /media/usb
git init --bare
git --work-tree=/ add -A
git --work-tree=/ commit
git --work-tree=/ push -u origin master

しかし、ベア リポジトリを新しい USB ドライブにクローンして呼び出すgit --work-tree=/ statusと、以前にプッシュされたすべてのファイルが削除され、追跡されていないことがわかります。ワークツリーを使用するように Git に指示する方法は?

4

1 に答える 1

1

以前にコミットされたファイルが削除されたと表示される理由は、最初のリポジトリのgitインデックス(単に という名前のファイルindex) が 2 番目のリポジトリのインデックスと異なるためです。最初のインデックスは作業ツリーに対応しますが、2 番目のインデックスは初期化されていないためエントリがありません。からの出力git statusは、2 つの比較の結果です。

  1. とインデックスの間HEAD(コミットするステージングされた変更を決定するため)
  2. インデックスと作業ツリーの間 (コミットされないステージングされていない変更を決定するため)

あなたの場合、HEAD2番目のリポジトリは、ルートファイルシステムからコミットしたすべてのファイルを含むコミットを指していますが、インデックスは空です。したがって、git が最初の比較を実行すると、これらの各ファイルは次のコミットで削除されるようにステージングされていると見なされます。

git が 2 番目の比較を実行すると、作業ツリーにはコミットと同じファイルがすべて含まれていることがわかりますが、もちろんインデックスはまだ空であるため、これらのファイルを「新しい」追跡されていないファイルと見なします。そのため、すべてのファイルが削除され、追跡されていないと表示されます。

解決策は非常に簡単です: 一致するように 2 番目のインデックスを初期化しますmaster

git --work-tree=/ reset

私がここにいる間、あなたが投稿したコマンドに関する他のいくつかの問題を指摘する必要があります:

  • まず、git add -Uすべての git リポジトリ メタデータ ファイルをリポジトリに追加します。つまり、リポジトリはそれ自体を追跡しています。これは使用方法の結果として起こっており、--work-tree非常に悪いことです。info/excludeまたはに追加して、リポジトリ ファイルが無視されるようにする必要があります.gitignore
  • 第 2 に、ここにはベア リポジトリは必要なく、切り離された作業ツリーだけが必要です。git config core.bare falseexport GIT_DIR=/media/usb;を介してこれを達成できたはずです。次に、外部から git コマンドを実行できます (つまり、上記) 。各コマンドにグローバル オプションとして/media/usb継続的に含める必要はありません。--work-tree=/

以下は、2 番目の箇条書きを除いて、今説明したすべてをカプセル化した完全なテスト ケースです。

#!/bin/sh

root=fakeroot
mkdir -p $root/media/usb{1,2} $root/{bin,etc}
echo a > $root/bin/sh
echo b > $root/etc/hosts

cd $root/media/usb1
git init --bare

# We don't want our git repository meta-data being tracked.
echo '/media/usb*/' >> info/exclude

git --work-tree=../.. add -A ../..
git --work-tree=../.. commit -m '1st commit'

echo c >> ../../etc/hosts
git --work-tree=../.. add -A ../..
git --work-tree=../.. commit -m '2nd commit'

git remote add origin ../usb2
git --git-dir=../usb2 init --bare

git push origin master

cd ../usb2
echo '/media/usb*/' >> info/exclude

echo "========================================="
echo "index in usb2 is not yet initialized:"
git --work-tree=../.. status
echo "========================================="
echo "initialize index to master (HEAD)"
git --work-tree=../.. reset
echo "========================================="
echo "now we have a clean working tree:"
git --work-tree=../.. status
于 2012-08-20T22:55:42.033 に答える