2012-01-26 1 views
4

Microsoft Windows에서 생성 된 git 저장소가 있습니다. Microsoft Windows에는 대소 문자를 구분하지 않는 파일 시스템이 있습니다. 이 저장소에 체크인하는 사람들은 파일 이름의 경우에주의하지 않았습니다. 즉, 동일한 디렉토리 또는 파일이 두 개의 다른 이름으로 표시되는 경우가 있습니다.어떻게하면 git 저장소의 각 리비전에 대한 파일 목록을 얻을 수 있습니까?

이 문제를 해결하려고합니다. 하지만 실제로 그것을 고치기 위해서는 그걸 처리해야합니다.

각 개정판에있는 파일의 목록을 빠르고 쉽게 얻을 수 있습니까?

어떤 수정본 (있는 경우)이 두 개의 다른 이름으로 동일한 파일을 가지고 있는지 파악하기 위해 필자는 이러한 경우를 수정하기위한 전략을 결정할 수 있습니다. 즉,이 정보를 가능한 한 빨리 수집해야 분석에서 상당한 시간을 소비 할 수 있습니다.

+0

내가 할 일은 git 저장소를 Mercurial로 가져 오는 것입니다. 그 명령은 분명히 내가 합리적으로 빨리 원하는대로 행동 할 것입니다. – Omnifarious

답변

3

한 가지 방법은 ls-tree 함께 :

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

(이것은 현재 디렉토리에 해당하는 트리의 부분에 보이는 있습니다, 그래서 당신은 당신의 repo의 최상위 레벨에서 실행해야 하나 또는 --full-tree 옵션을 주면됩니다.)

이것은 Git이해야 할 일은 재귀 적으로 트리를 검사하기 때문에 본질적으로 순간적입니다. 파일의 내용을 볼 필요조차 없습니다.

파일 이름 목록을 사용하여 두 개의 다른 이름으로 동일한 파일을 검색하는 방법을 잘 모르겠습니다. 대소 문자를 구별하지 않는 파일 시스템에서 같은 이름의 파일 이름을 찾고자한다면 파일 이름 목록 만 있으면됩니다.

그러나 실제로 파일의 내용이 같다고 생각하면 --name-only을 삭제하여 모든 파일의 SHA1을 볼 수 있으며 중복 된 해시를 찾아 동일한 파일을 찾을 수 있습니다.

+0

감사합니다. 예. 대소 문자를 구분하지 않기 때문에 충돌 만 신경 씁니다. 내용은 충돌리스트와 리비전이있는 후에 나중에 해결할 수 있습니다. 기본적으로 충돌 파일 쌍 중 하나를 제거하기 위해 리포지셔너 또는 이와 유사한 것을 사용할 필요가 있습니다. 나는 Mercurial을 아주 잘 알고 있기 때문에 repo를 Mercurial로 변환하는 데 여전히 절반의 마음을 가지고있다 (그리고'hg convert'는 reposurgeon이 + 어떤 것을 수행한다). 그러나 그렇습니다, 이것은 매우 도움이됩니다. 감사! – Omnifarious

+0

이 테스트를 거쳤습니다. 예, 원하는대로 정확하게 수행 할 수 있으며, 유용하기에 충분히 빠릅니다. – Omnifarious

-1

는이 같은 것을 실행할 수 있습니다 :

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

이 명령은 SHA1 모든 개정 변경된 파일의 목록을 보여줍니다. 이를 얻을 수

+0

그래서 모든 개정판에서 전체 목록이 무엇인지에 대한 실행 아이디어를 구성하기 위해 Python 스크립트에서이를 마무리해야합니다. – Omnifarious

+0

@Omnifarious : 예, 이것은 "변경된"파일이 실제로 삭제되었을 수 있으므로, 특히 --name-status를해야하고, 삭제를위한 ... 그래, 내 대답을 참조하십시오. – Cascabel

관련 문제