2017-12-28 2 views
1

마스터 분기가 있다고 가정 해보십시오. 일단 새로운 지점이 만들어졌습니다. 이제이 브랜치가 작성되기 전에 커밋 된 주석없이이 브랜치를 새 저장소로 정확하게 이동하려고합니다.루트가없는 분기를 새 저장소에 푸시

사진 : 1. 오래된 저장소

newbranch C - D - E 
      /
master A - B 

사진 : 2. 새로운 저장소 내가 newbranch를 이동할 필요가 없습니다

newbranch  C - D - E 
      /
master  Z 

, 나는 그것을 시도하지만 이전의 모든 역사를했다 . 커밋을 삭제하는 데 도움이되는 rebase에 대해서도 잘 알고 있습니다. 하지만 요점은 새로운 레포에서보고 싶지 않은 1000 가지 이상의 커밋이 있다는 것입니다. 리베이스 모드에서 수동으로 삭제할 수 없습니다.

모두이 newbranch를 사람들에게 보여줄 필요가 있습니다.이 지점에서는이 지점을 만들었지 만 이전 지점은 작성하지 않았습니다.

답장을 보내 주셔서 감사합니다.

+0

이 새로운 저장소에 대해 자세히 설명해 주실 수 있습니까? 처음부터 새로 만들거나 현재의 레포와 어떤 관련이 있습니까? 짜증이 여기 일할 수도 있습니다. –

+0

나는 내 자신의 지점을 만든 큰 repo 있습니다. 이제 다른 사람들에게 내가 한 일을 보여주고 싶습니다. 나는 그들이 다른 것을보기를 원하지 않는다. 그래서 내가 비트 버킷에 대한 자신의 레포를 만들고, 내 지부 (정확하게 내가 한 일)를 밀어서 미립자가 보는 것을 허락하고 싶습니다. – vladimir

+0

@vladimir 새 repo를 재설정하고 다시 실행할 수있는 경우 rebase (많은 병합 충돌이 있음) 대안을 제안하는 답변을 편집했습니다. 그 대안은 훨씬 빠르고 쉽습니다. – VonC

답변

0

새 저장소에 고아 분기를 만들 수 있습니다. (git checkout --orphan), 더미 커밋을 하나 만듭니다.
Z (아직 새 리포에 있음)에서 새 지점을 만듭니다.

이렇게하면 이전에 repo가 ​​로컬로 복제 된 것으로 가정합니다.
그리고 로컬에서도 새 저장소를 만들었습니다.

cd c:\a\path 
git init create newrepo 
cd newrepo. 

첫째, 기존의 repo가 ​​B에서 체크 아웃되어 있는지 확인합니다 (즉,이 지점 이전에 커밋 나타내는 SHA1)

cd C:\path\to\old\repo 
git checkout B 

그런 다음 새 빈의 repo에 콘텐츠를 가져

cd C:\a\path\newrepo 
git --work-tree=C:\path\to\old\repo add . 
git commit -m "Import old repo as Z" 

새 저장소에서 이전 저장소를 가져 와서 새 저장소에서 커밋을 리베이스 할 수 있습니다.

cd C:\a\path\newrepo 
git remote add oldrepo C:\path\to\old\repo 
git fetch oldrepo 

git checkout -b newbranch 

git rebase --onto newbranch C~ oldrepo/newbranch 

새 repo에서 원하는 커밋 만 재생성합니다.


하지만 rebase는 문제가 될 수 있으며 많은 경우 merge conflicts to be resolved manually입니다. in this example를 볼 때 귀하의 경우에는

, 당신은 귀하의 경우 git graft points에, 그 전체와 git replace을 피하거나 할 수있다.
는 그 다음 git fetch oldrepo 단계까지 과거의 지침을 따르십시오 :

git fetch oldrepo 
git checkout -b newbranch oldrepo/newbranch 
echo SHA1(C) SHA1(Z) > .git/info/grafts 

(커밋 xxx의 SHA1에 의해 SHA1(xxx)를 교체합니다.Z은 새가 C이 처음

부모가 여기에 필요한 C (NO 병합/REBASE)의 커밋으로 Z를 선언 할 것이다) 이전의 repo에 newbranch의 커밋되고, 새로운 REPO에서 수행 커밋된다.
은 영구적으로, git filter-branch를 사용하도록하려면

git filter-branch --tag-name-filter cat -- newbranch 
rm .git/info/grafts 

그런 다음 밀어 수있는 새로운으로 업데이트 지점입니다.

git remote add origin /url/of/new/remote/repo 

git push -u origin master 
git push -u origin newbranch 
관련 문제