他の人も示唆しているように、git add -N
を使用してインデックスにダミーエントリを追加できます。実行:
git diff <hash>
は、与えられた<hash>
(<hash>
と比較するためにどの作業ツリーのバージョンを決定する(現在は人跡未踏のファイルのエントリを持っている)既存のインデックスを使用して、現在の作業ツリーに与えられたと比較しますコミットID、ツリーID、ブランチ名、またはGitがツリーに解決できるもの)である可能性があります。しかし、あなたが言ったように、これはあなたが、インデックスを台無しにし、そして:
はトリックが、代わりに、使用する一時的なある
最大限原子と堅牢な方法でこれをやりたいですインデックス。
最初のコミットは、ファイルbar
とfoo
です。 2番目のコミットにはファイルfoo
が削除されています。現在の作業ツリーにはfoo
が復活し、新しいファイルがgit status --short
に表示されます。HEAD
に対する差分に
$ ./diffscript 8527327
diff --git a/diffscript b/diffscript
new file mode 100755
index 0000000..8d5c978
--- /dev/null
+++ b/diffscript
@@ -0,0 +1,6 @@
+#! /bin/sh
+export GIT_INDEX_FILE=$(mktemp) || exit
+rm -f $GIT_INDEX_FILE
+trap "rm -f $GIT_INDEX_FILE" 0 1 2 3 15
+git add -A
+git diff ${1:-HEAD}
index 3ec370c..d319048 100644
--- a/foo
+++ b/foo
@@ -1 +1 @@
-I am a foo
+I was foo, am now resurrected
このdiffscript
デフォルト:初期コミットすることを
$ git log --all --decorate --oneline --graph
* 11b241c (HEAD -> master) remove foo
* 8527327 initial
$ git status --short
A diffscript
A foo
注意は、私たちが引数としてdiffscript
に渡すものですこれは、8527327
です。したがって、引き数を指定せずに実行すると、git add -A
がほとんどなので、インデックスまたは作業ツリーと比較するかどうかは関係ありません。同じ、モジュロ.gitignore
指令)。
trap ...
行は、スクリプトが^ C(シグナル2、SIGINT)またはネットワーク切断(シグナル1、SIGHUP)またはQUIT(シグナル3、SIGQUIT)で終了するかどうかを確認します。 TERMINATE(シグナル15、SIGTERM)、または単に通常通り終了します(0ではシグナルではなく、正常終了)。
いいえ、Gitはファイルが全く存在しないか、インデックスファイルの署名があると主張しています。空のファイルは許可されていません。mktemp
のテンポラリファイルを削除するので、git add
ステップは正しい署名。
[未追跡のファイルにgit diffを使用することはできますか?](https://stackoverflow.com/questions/855767/can-i-use-git-diff-on-untracked-files) –
' git add -N。 git diff HEAD..HEAD〜1'? –
@SajibKhan:実際には、それはうまくいくことが分かりました(私はコメントを削除しました)。しかし、この特定の目的(スクリプト)のためのやや良い方法があります。 – torek