2017-09-13 6 views
3

私は古いコミットを持っています。私はコミットB = HEAD!= Aにあり、未処理のファイルを含む私の作業ディレクトリの状態をAと比較したいと思います。未処理のファイルを含む作業ツリーに関するgit diff

現在のところ、未追跡のファイルがコミットAの一部であったため、それらが表示されず、希望するdiffを混乱させないためです。

回避策として、diffの前に手動でgit add <all the untracked files>を、その後にgit reset <all the untracked files>を手入力できました。しかし、多くの未追跡のファイルがあります。これをスクリプトですべて実行しているので、私はこれを最大限の原子的かつ堅牢な方法で実行したいと考えています。

編集:This questionは、未処理のファイルとの差分も関係しています。しかし、そこでの回答には手作業での追加と後でuntrackedファイルの削除が必要で、スクリプト環境での中断に対するエラーを防ぐために、より自動的に、そして原子的な方法でこれを行うソリューションが好まれました。受け入れられた答えは正確にこれを行い、実際にリンクされた質問に対する回答とは異なります。唯一のインデックスに空のエントリを追加します(git add -Nと同じ)

git add --intent-to-add

これではなく、ファイルそのものを:

+1

[未追跡のファイルにgit diffを使用することはできますか?](https://stackoverflow.com/questions/855767/can-i-use-git-diff-on-untracked-files) –

+0

' git add -N。 git diff HEAD..HEAD〜1'? –

+0

@SajibKhan:実際には、それはうまくいくことが分かりました(私はコメントを削除しました)。しかし、この特定の目的(スクリプト)のためのやや良い方法があります。 – torek

答えて

3

他の人も示唆しているように、git add -Nを使用してインデックスにダミーエントリを追加できます。実行:

git diff <hash> 

は、与えられた<hash><hash>と比較するためにどの作業ツリーのバージョンを決定する(現在は人跡未踏のファイルのエントリを持っている)既存のインデックスを使用して、現在の作業ツリーに与えられたと比較しますコミットID、ツリーID、ブランチ名、またはGitがツリーに解決できるもの)である可能性があります。しかし、あなたが言ったように、これはあなたが、インデックスを台無しにし、そして:

はトリックが、代わりに、使用する一時的なある

最大限原子と堅牢な方法でこれをやりたいですインデックス。

最初のコミットは、ファイルbarfooです。 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ステップは正しい署名。

+0

私はそれを手に入れません。 'diffscript'はすべてをインデックスに追加してそこに残します。 – Bananach

+1

' GIT_INDEX_FILE = $(mktemp)||終了する。 *インデックスを使用せず、*他の*インデックスを使用します。 * *インデックスはそのままです!しかし、バグ修正が必要です: 'export'! (私はそれを正しくテストしていませんでした) – torek

+0

ああ、GIT_INDEX_FILEには機能があることはわかりませんでした。しかし、今私は "インデックスファイルが予想よりも小さくなる" – Bananach

1

あなたが見てみることができます。違いは、diffコマンドを使用するときに見られます。

GITのドキュメント:--intentツー追加

これはgitのdiffを持つようなファイルのunstaged内容 を示すと、それらをコミットし、とりわけ、便利です

git commit -a。>パスが後で追加されるという事実だけを記録します。 のエントリは、内容のないインデックスにパスが配置されます。

+0

正しい方向に進みますが、私が望むように自動的で原子的ではありません。 (追跡されていないファイルをすべて追加して覚えておき、後でそれらを再設定する必要があります) – Bananach

関連する問題