2012-01-26 10 views
4

私はMicrosoft Windowsで作成されたgitリポジトリを持っています。 Microsoft Windowsでは大文字と小文字を区別しないファイルシステムがあります。このリポジトリにチェックインしている人は、ファイル名の大文字と小文字を区別していません。つまり、同じディレクトリまたはファイルが2つの異なる名前で表示されることがあります。gitリポジトリのリビジョンごとにファイルマニフェストを取得するにはどうすればよいですか?

私はこの問題を解決することを意味します。しかし、本当にそれを修正するために、私はそれを扱う必要があります。

各リビジョンのファイルのリストを取得するために迅速かつ簡単な方法はありますか?

私はこのようなケースを固定するための戦略を決めることができるように、2つの異なる名前で同じファイルを持っているリビジョン(もしあれば)を把握するために、これを必要としています。これは、この情報を可能な限り迅速に取得する必要があることを意味します。そのため、解析には時間がかかります。

+0

私はgitリポジトリをMercurialにインポートすることを考えます。これにはマニフェストコマンドがあります。これは、私が合理的にすばやくしたいものを正確に実行します。 – Omnifarious

答えて

3

一つの方法は、ls-treeである:

git ls-tree -r --name-only <commit> 

(これは現在のディレクトリに対応するツリーの部分を見て、あなたはあなたのレポのトップレベルからそれを実行する必要がありますいずれかのことに注意してください、または--full-treeオプションを与える)

Gitが関係しているすべてを再帰的にツリーを調べているので、これは、基本的に瞬間的です。それはファイルの内容を見る必要はありません。

私はあなたが2つの異なる名前の下で同じファイルを検出するために、ファイル名のリストを使用するつもりかどうかはわかりません。大文字と小文字を区別しないファイルシステムで同じ名前のファイル名を探したいだけであれば、ファイル名のリストが必要です。

ファイルが実際に同じ内容であると思われる場合は、すべてのファイルのSHA1も表示され、重複するハッシュを探して同じファイルを見つけることができます。

+0

ありがとう!はい。私は、大文字と小文字の区別がないため、衝突についてしか気にしません。内容は、私が衝突のリストとどのリビジョンが存在するのかを後で調べることができるものです。基本的には、衝突するファイルのペアを削除するために、reposurgeonなどのものを使用する必要があります。私はMercurialをよく知っているので(そして '' hg convert'はreposurgeonが何をしているのか+)、RepoをMercurialに変換するのはまだ半分です。しかし、はい、これは非常に便利です。ありがとう! – Omnifarious

+0

私はこれをテストしました。そして、そうです、それは私が欲しいものを正確に行い、そしてすぐに役立ちます。 – Omnifarious

-1

あなたはこのような何かを実行することができます:

git log --name-only --pretty="format:%H" 

このコマンドはSHA1およびすべてのリビジョンのために変更されたファイルの一覧が表示されます。これを取得する

+0

だから私は、すべてのリビジョンでマニフェスト全体が何であったかを実行するためのアイデアを構築するために、Pythonスクリプトでそれをラップする必要がありますか? – Omnifarious

+0

@Omnifarious:うん、これはあなたが何をしようとしてにとって本当に有用ではありません - 「変更」ファイルが実際に削除された可能性があり、特に以来、あなたは '--name-status'を行う必要があるだろうので、と時計削除のため...ええ、私の答えを参照してください。 – Cascabel

関連する問題