2015-01-07 5 views
0

구성 정보가 포함 된 저장소가 있습니다. 환경에 지점을 일대일로 매핑하는 방식으로 지점에서 관리됩니다. 모든 브랜치에는 루트에 foo.txt 파일이 있습니다. 가지의 이름은 A, B, C 등입니다.브랜치와 서브 디렉토리의 복사로 병합

환경 설정을위한 브랜치를 사용하는 것이 고통스럽고 디렉토리가 대신 있다고 생각했습니다. 제가하고 싶은 것은 가지의 내용을 가져 와서 디렉토리 아래의 마스터에 존재하게하는 것입니다. 따라서 지점 A, B, C 대신에 디렉토리 A, B, C가 있으며 각 디렉토리에는 foo.txt가 들어 있습니다.

연고에있는 파리는 역사를 보존하고 싶습니다.

지점 A로 이동하여 첫 번째 커밋을 A- 이동으로 분기하고 이동 된 분기 내역에 대체 기록을 표시하려고했습니다. 예 :

git co [sha of first commit on A] 
git co -b A-moved 
mkdir A 
git mv foo.txt A 
git commit -m "moved for A" 
git cherry-pick A ^A-moved ^master 

나는 다음 디렉토리가라고하고, 먼저 나는에서 체리 따기 시도 그런 지점 ​​A에 커밋과 같은 내용을 포함한다는 점에서 foo.txt의를 생성, 다시 마스터에 시도 A-moved 지점,하지만 꽤 많은 갈등을 만들었습니다.

git co master 
mkdir A 
cd A 
echo "blah blah" >foo.txt 
git commit -am "first entry in A dir" 
git cherry-pick A-moved ^A ^master 
** KABOOM O' CONFLICTS ** 

나는이 모든 잘못에 대해 반드시 알아야 할 몇 가지 제안을 원합니다.

답변

0

친구에게 트위터에 대한 답변이있었습니다. 대답은 물론 git filter-branch를 사용하여 해당 브랜치의 내역을 다시 작성하는 것입니다.

$ cat >~/move-foo.sh 
    if [ -f foo.txt ]; then mkdir $1; git mv foo.txt $1; fi 
    (Ctrl-D) 

그런 다음 필터 지점을 실행합니다 : 먼저 생성 및 이동 디렉토리를 수행하는 쉘의 조각을

git filter-branch --tree-filter 'sh ~/move-foo.sh A' -f A 
그것은 모두 함께 하위 디렉토리처럼 지점 A의 역사는 다음에서 볼 것이다

어떤 점에서 당신은 그것을 마스터에 병합 할 수 있습니다. 예!

+0

'filter-branch'를 사용하면 히스토리를 재 작성하여 새로운 커밋 (ids)을 도입 할 수 있습니다. 이것이 당신이 원하는 것입니까, 아니면 지점을 통합하는 새로운 커밋을 원하십니까? –

+0

René, 지사에서 오래된 커밋을 기반으로 새로운 커밋을 만드는 것이 좋습니다. 이 솔루션은 나를 위해 충분히 잘 작동합니다. –

관련 문제