フォルダーとgitリポジトリーのサブフォルダーを比較する


6

nowgitリポジトリからエクスポートされたフォルダーとgitリポジトリ自体があります:

/
/now/
/repository.git/

ファイルをnowリポジトリの現在の状態と比較したいと思います。これは簡単で行われている間--git-dir=/repository.git--work-tree=/now

git --git-dir=/repository.git --work-tree=/now status

gitリポジトリにあるもののサブフォルダーがいつnowだったかは、私にはそれほど明白ではありません。

リポジトリ内のフォルダと対応するサブフォルダdiffgit何らかの方法で比較する方法はありますか(リポジトリを再度チェックアウトし、内容を確認する以外に)。(gitは単一ファイルの変更という概念を中心にしていないことを知っているため、実際には十分な情報に基づいたnoを期待してます。)

回答:


2

一時インデックスファイルにリポジトリのサブディレクトリの内容だけを入力し、既存のファイルをそれに対して比較できます。

diff-sub() { : usage: diff-sub repo treeish-in-repo external-dir
  (
    GIT_DIR="$1" GIT_WORK_TREE="$3"
    GIT_INDEX_FILE=/tmp/.git-index--now-sub.tmp
    if test -e "$GIT_INDEX_FILE"; then
      echo "already exists: $GIT_INDEX_FILE"
      exit 1
    fi
    export GIT_DIR GIT_INDEX_FILE GIT_WORK_TREE
    git read-tree "$2" &&
    git diff
    ec=$?
    rm -f "$GIT_INDEX_FILE"
    exit "$ec"
  )
}
: diff sub from master in /repository.git against /now
diff-sub /repository.git master:sub /now

注:通常の完全なツリー(例:git statusまたはのgit diff --cached代わりgit diff)と比較する他のGitコマンドを実行すると、インデックスと作業ツリーの両方に通常の完全なツリーの一部しか含まれないため、奇妙な結果が表示されます。


うーん、面白いアイデア。一時インデックスファイルはどのように取得しますか?git-read-treeインデックスファイル自体の形式や形式などを調べましたが、バイナリファイルの編集を除いてはまだわかりません。
ボルデウィン

Gitコマンドは、Gitインデックスファイルの読み取り/更新にのみ使用する必要があります(つまり、独自の「配管」コマンドを作成する場合を除き、ディスク上のバイナリ形式について知る必要はありません)。GIT_INDEX_FILE環境変数が設定されている場合、すべてのGitコマンドは、通常のインデックスファイル(通常.git/index)の代わりに指定されたファイルを使用します。答えのシェルコードの場合、git read-treeコマンドは代替インデックスファイルを作成し、git diffコマンドはそれを読み取り、その有効な内容を指定された作業ツリーと比較します。
クリスジョンセン

2

あなたはサブフォルダにつながるディレクトリ構造を再作成しての利点を取ることができます--relativeのようなコマンドにオプションdifflog(ではありませんstatus)。たとえば、次のチェックアウトがある場合sub/dir

mkdir -p sub
mv now sub/dir
git --git-dir=/repository.git diff --relative=sub/dir

+1、ありがとう。私はそれなしでは不可能だと思いmvますか?
ボルデウィン

@Boldewyn:私が知っていることではありませんが、私はgit初心者です。移動に問題がある場合は、cp -al(ディレクトリのハードリンクファイルをコピーする)またはbindfsを使用できます。
ジル

bindfsを教えてくれてありがとう(FUSEの力が本当に好きになり始めました...)。
ボルデウィン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.