2017-10-08 11 views
0

ある時点ではgit repoですが、今はrepoにはありません。ここでは3つのシナリオがあります。ある時点でファイルがgit repoにあったが、今は存在しない場合は、ファイルが「名前が変更された」、「削除された」、「名前が変更されて削除された」かを調べる

  1. ファイルの名前が変更されました。もしそうなら、ファイルの現在の名前は何か。
  2. ファイルが削除されました。ファイルが削除される前のある時点でファイルの名前が変更されていない場合は、これは簡単です。
  3. ファイルの名前が変更され、削除されました。

名前が変更された場合、またはファイルが削除された場合、ファイルの現在の名前を知ることに興味があります。

私はpowershellでgitを使用しているWindowsマシンですが、これらの手順は他のシステムでは簡単に複製できます。

手順

a。私は2つのファイルを追加した。

Add-Content file1.txt "This is file 1" 
Add-Content file2.txt "This is file 2" 
git add . 
git commit -m "Added file1.txt and file2.txt" 

b。私はfile1.txtの名前を変更しました。

git mv file1.txt fileone.txt 
git commit -m "Renamed file1.txt to fileone.txt" 

cです。私はfile2.txtを削除しました

Remove-Item file2.txt 
git add . 
git commit -m “Deleted file file2.txt” 

これらの2つのファイルを変更しないこれらのコミット間には、より多くのコミットが存在する可能性があります。これまでの私のgitログです

git log –oneline 
d618114 (HEAD -> master) deleted file2.txt 
ba6ec22 Renamed file1.txt to fileone.txt 
fe2a51e Added file1.txt and file2.txt 

これは私がこれまで持っているものです。

出力:

commit ba6ec22e3fdf7e6eb6f33acd83f49f99e9f2610a 
Author: Sunil Shahi <[email protected]> 
Date: Sun Oct 8 15:35:02 2017 -0500 

    Renamed file1.txt to fileone.txt 

D  file1.txt 

commit fe2a51e9aa5835c5886b31f988e4076155c1194e 
Author: Sunil Shahi <[email protected]> 
Date: Sun Oct 8 15:31:27 2017 -0500 

    Added file1.txt and file2.txt 

A  file1.txt 

これに伴う問題は、それが実際に名前が変更されたときに、ファイルがコミット私の第二に削除されたことを示しているということです。 --followフラグで現在のファイル名を使用すると、詳細はわかりますが、ファイル名はわかりません。

git log --follow --name-status -- "fileone.txt" 

出力

commit ba6ec22e3fdf7e6eb6f33acd83f49f99e9f2610a 
Author: Sunil Shahi <[email protected]> 
Date: Sun Oct 8 15:35:02 2017 -0500 

    Renamed file1.txt to fileone.txt 

R100 file1.txt  fileone.txt 

commit fe2a51e9aa5835c5886b31f988e4076155c1194e 
Author: Sunil Shahi <[email protected]> 
Date: Sun Oct 8 15:31:27 2017 -0500 

    Added file1.txt and file2.txt 

A  file1.txt 

このアプローチは、削除されたファイルのために十分です。しかし、それが削除される前にある時点で名前が変更された場合、同じ問題が発生します。

ありがとうございます。

答えて

1

これは基本的にはかなり困難です。これに対してGitが提供するツールは本当に適切ではありません。 git log --followは、一度に1つのファイルに対してかなりうまく動作しますが、現在の名前から始まり後方に作用するという問題があります。 (それはまたハックです:`git log --follow --graph` skips commitsgit combining two files into one with history preservedを参照してください。)

は何ができることは、それぞれの親/子ペアの間git diffを実行するコマンドのいずれかと一緒にgit log --reverseを使用することです。たとえば、git log --rawgit diff-treeを有効にして名前変更を有効にして実行すると、これはデフォルトで有効になっているため、私はわかりませんが、必要に応じて-Mを追加してください)

$ git log --raw --since 02-20-2010 --until 02-28-2010 --reverse --oneline 
2d3ca2167 t7006-pager: if stdout is not a terminal, make a new one 
:100755 100755 4f52ea573... da0f96262... M  t/t7006-pager.sh 
:000000 100755 000000000... 73ff80937... A  t/t7006/test-terminal.perl 
9892bebaf sha1_file: don't malloc the whole compressed result when writing out objects 
:100644 100644 657825e14... 9196b5783... M  sha1_file.c 
ea68b0ce9 hash-object: don't use mmap() for small files 
:100644 100644 657825e14... 037515960... M  sha1_file.c 
e95a4df46 Merge branch 'mv/request-pull-modernize' 
7fa2b1f60 Merge branch 'jn/makefile-script-lib' 
92de34894 Merge branch 'jc/maint-fix-test-perm' 
25666af37 Merge branch 'jc/checkout-detached' 
5f8a0de98 Merge branch 'sp/push-sideband' 
db3df36a3 Merge branch 'hm/maint-imap-send-crlf' 
cab1b013e Merge branch 'tc/maint-transport-ls-remote-with-void' 
241b9254e Merge branch 'ml/maint-grep-doc' 
1caaf225f git-diff: add a test for git diff --quiet -w 
:100755 100755 60dd2014d... 0391a5827... M  t/t4017-diff-retval.sh 
748af44c6 sha1_file: be paranoid when creating loose objects 
:100644 100644 9196b5783... c0214d794... M  sha1_file.c 
8c33b4cf6 tests: Fix race condition in t7006-pager 
:100755 100755 da0f96262... d9202d5af... M  t/t7006-pager.sh 
81b50f3ce Move 'builtin-*' into a 'builtin/' subdirectory 
:100644 100644 afedb54b4... f1025d5c0... M  Makefile 
:100644 100644 2705f8d05... 2705f8d05... R100 builtin-add.c builtin/add.c 
:100644 100644 fc43eed36... fc43eed36... R100 builtin-annotate.c  builtin/annotate.c 
:100644 100644 3af4ae0c2... 3af4ae0c2... R100 builtin-apply.c builtin/apply.c 
:100644 100644 6a887f5a9... 6a887f5a9... R100 builtin-archive.c  builtin/archive.c 
:100644 100644 5b226399e... 5b226399e... R100 builtin-bisect--helper.c  builtin/bisect--helper.c 
:100644 100644 10f7eacf6... 10f7eacf6... R100 builtin-blame.c builtin/blame.c 
:100644 100644 a28a13986... a28a13986... R100 builtin-branch.c  builtin/branch.c 
:100644 100644 2006cc5cd... 2006cc5cd... R100 builtin-bundle.c  builtin/bundle.c 
[massive snipping from here onward] 

2010年2月下旬、commit 81b50f3ce40bfdd66e5d967bf82be001039a9a98で、builtin-*のすべてのソースファイルをLinus Torvaldsがbuiltin/*に移動しました。上記のgit logは、表示されたコミットを、その月の先週またはそれ以降のコミットに限定します。検出を--rawと一緒--reverseを使用し、名前の変更、我々はbuiltin-add.cとして覚えているかもしれないファイルがbuiltin/add.cになったことがわかり:類似性検出器は、それがまったく同じ(類似のR100、100%)ですが、名前が変更されたことを検出します。あなたが使用することはできません

注:

$ git log --follow --reverse builtin-add.c 
fatal: ambiguous argument 'builtin-add.c': unknown revision or path not in the working tree. 

をので、あなたは新しい名前が何であるかわからない場合、あなたはGitがすべてコミット内のすべてのファイル名を表示し、その差分が生成した名前を変更するレコードを検索できるようにする必要があります名前を変更するコミットの場合、です。

出力(git-whatchangedで取得していましたが、これは7〜8年前にGitを使用していたユーザーにとって)'^:.*R.*file-name-you-care-aboutTAB'を検索するのは比較的簡単です。そこからファイルの新しい名前が取得されます。ファイルの名前が何度も​​変更された場合は、新しい名前で練習を繰り返す必要があります。

+0

この細心の注意深い答えをありがとう。私はそれが私が予想したよりも少し仕事があることを認識していますが、それは楽しい読書です。あなたの最後の段落の正規表現がgrep用であると仮定しています。つまり、Windowsで利用できる他のツールに合わせて修正する必要があります。私はSelect-Stringがすべきだと思います。 –

+0

Windows Gitをお持ちの場合は、シェルとgrepがあります.Gitスクリプトの中には、シェルスクリプトで書かれており、sedやgrepなどのコマンドを使用しているものがあります。しかし、他の検索ユーザーはより速くて便利かもしれません。 – torek

関連する問題