2011-04-13 6 views
7

힘내의 도구로 전체 기록을 수정하면서 파일을 새 폴더로 옮길 수 있습니까? 마치 파일이 처음 추가 된 것처럼 보입니다.힘내 : 기록에서 파일을 옮길 수도 있음

내가 함께 몇 가지의 repos를 병합 한 후이에 와서 : 나는 하나 "최고"의 repo 내에서 서로 다른 폴더에 몇 가지의 repos에서 파일을 이동, 그러나 병합 된 역사는 완전히 다른 파일이 충돌 할뿐만 git rebasegit svn 도구를 사용하여 아주 나쁜 행동 물론 그들의 오래된 위치에.

답변

6

그래서 지금이 일을 가지고 :

git filter-branch --tree-filter '(ls -A; mkdir TheSubdir; echo TheSubdir) | xargs mv'

이상한하지만 좋은 : 곳이해야 .git 디렉토리가 유지; 어쩌면 자식이 어떻게 든 운동을 방해하고있는 걸까요?

+1

'필터'셸 명령은 하위 디렉토리 .git-rewrite에서 git에 의해 실행됩니다. 내부에는 현재 개정 파일 만 있습니다. 시원한. – dronus

5

전체 기록을 수정하려면 모든 커밋을 다시 작성해야합니다. 이 작업을 수행하는 가장 좋은 방법은 git filter-branch입니다. 특히, 귀하의 경우에 git filter-branch --tree-filter some-command은 히스토리의 모든 버전을 체크 아웃하고, 문제가되는 디렉토리 이동과 같이 작업 트리를 수정할 수있는 명령을 실행 한 다음 해당 커밋을 다시 작성하여 나무의 새로운 내용.

+0

좋아 멋진. 그래서 기본적으로,'git filter-branch'는 모든 개정판을 체크 아웃 한 다음 다시 체크인하여 이전 것을 대체합니다. 야생의 소리가 난, 나는 내가 기억하고있는 pathes ..을 다시 쓸 것이라고 생각했다. 어쨌든, 나는 그것을 시도해라! – dronus

+0

@dronus 네, 그게 그게 전부입니다. –

+0

@dronus 실제로, 여러분이 주위를 움직이는 여러분의 경우,'git filter-branch --index-filter'를 할 수 있어야합니다. 이것은'--tree-filter'와 같지만 실제로 파일을 체크 아웃하지 않으면 인덱스의 모든 것을 직접 조작해야합니다. '--tree-filter'보다 실행하는 것이 더 빠르지 만, 단순히 파일을 이동하는 대신 색인을 직접 수정해야하기 때문에 작성하기가 조금 더 어려울 것입니다. 'filter-branch' 문서의 끝 부분에 예제가 있습니다. –

0

accepted answer의 명령은 다음 버전이 안전 등 공간을 포함하는 파일/디렉토리에 실패합니다

git filter-branch -f --tree-filter 'mkdir TheSubdir; \ 
find . -maxdepth 1 -name TheSubdir -prune -o -name . -true -o -print0 | \ 
xargs -0 mv -t TheSubdir' 
관련 문제