IT

자식에서 관련되지 않은 분기를 저장소에 도입하는 간단한 방법이 있습니까?

lottoking 2020. 3. 8. 16:24
반응형

자식에서 관련되지 않은 분기를 저장소에 도입하는 간단한 방법이 있습니까?


오늘 자식 문제를 겪고있는 친구를 돕는 동안, 나는 지점과 완전히 분리되어야하는 지점을 소개해야했습니다 master. 이 브랜치의 내용은 실제로 브랜치에서 개발 된 것과 다른 기원을 master가졌지 만 master나중에 브랜치 로 병합 될 것 입니다.

나는 John Wiegley의 Git을 맨 처음 부터 브랜치가 본질적으로 특정 규칙을 따르는 커밋에 대한 레이블과 커밋이 파일 트리 및 선택적으로 부모 커밋에 연결되는 방식을 레이블로 읽는 것을 기억했습니다 . 우리는 git의 배관을 사용하여 기존 저장소에 부모없는 커밋을 만들었습니다.

그래서 우리는 색인의 모든 파일을 제거했습니다 ...

$ git rm -rf .

... tarball에서 추출 된 디렉토리와 파일을 색인에 추가했습니다 ...

$ git add .

... 트리 객체를 생성했습니다 ...

$ git write-tree

( git-write-tree생성 된 트리 객체의 sha1sum을 알려줍니다.)

그런 다음 부모 커밋을 지정하지 않고 트리를 커밋했습니다 ...

$ echo "Imported project foo" | git commit-tree $TREE

( git-commit-tree만약 커밋 객체의 sha1sum을 알려주세요.)

... 그리고 새로 만든 커밋을 가리키는 새 브랜치를 만들었습니다.

$ git update-ref refs/heads/other-branch $COMMIT

마지막으로 master지점으로 돌아와 작업을 계속했습니다.

$ git checkout -f master

이것은 계획대로 작동 한 것 같습니다. 그러나 이것은 분명히 git을 사용하기 시작한 누군가에게 가볍게 추천하기 위해 권장하는 종류의 절차가 아닙니다. 지금까지 저장소에서 발생한 모든 것과 전혀 관련이없는 새 브랜치를 작성하는 더 쉬운 방법이 있습니까?


V1.7.2부터는이 기능을 다른 답변보다 조금 더 높은 수준으로 만드는 새로운 기능이 있습니다.

git checkout이제 --orphan옵션을 지원합니다 . 로부터 man 페이지 :

git checkout [-q] [-f] [-m] --orphan <new_branch> [<start_point>]

<start_point>에서 시작하여 이름이 <new_branch> 인 고아 브랜치를 작성 하고 전환하십시오. 이 새로운 브랜치에서 첫 커밋은 부모가 없으며 다른 모든 브랜치 및 커밋과 완전히 분리 된 새로운 역사의 근원이 될 것입니다.

이것은 어 커가 원하는 것을 정확하게 하지 않습니다 . 왜냐하면 인덱스와 작업 트리를 채 웁니다 <start_point>(결국 체크 아웃 명령이므로). 필요한 다른 조치는 작업 트리 및 색인에서 원하지 않는 항목을 제거하는 것입니다. 불행히도 git reset --hard작동하지 않지만 git rm -rf .대신 사용할 수 있습니다 ( rm .git/index; git clean -fdx다른 답변 과 동일하다고 생각 합니다).


요약해서 말하자면:

git checkout --orphan newbranch
git rm -rf .
<do work>
git add your files
git commit -m 'Initial commit'

<start_point>기본값은 HEAD이므로 지정되지 않은 채로 두었 습니다. 어쨌든 실제로 신경 쓰지 않습니다. 이 순서는 본질적 으로 무서운 배관 명령에 의지하지 않고 Artem의 답변 의 명령 순서와 본질적으로 동일 합니다.


에서 힘내 커뮤니티 도서 :

git symbolic-ref HEAD refs/heads/newbranch 
rm .git/index 
git clean -fdx 
<do work> 
git add your files 
git commit -m 'Initial commit'

git symbolic-ref인덱스를 사용 하거나 제거 하는 솔루션이 작동하더라도 개념적으로 리포지토리 를 만드는 것이 더 깨끗할 수 있습니다

$ cd /path/to/unrelated
$ git init
[edit and add files]
$ git add .
$ git commit -m "Initial commit of unrelated"
[master (root-commit) 2a665f6] Initial commit of unrelated
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 foo

그런 다음 가져옵니다

$ cd /path/to/repo
$ git fetch /path/to/unrelated master:unrelated-branch
warning: no common commits
remote: Counting objects: 3, done.
Unpacking objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
From /path/to/unrelated
 * [new branch]      master     -> unrelated-branch

이제 / path / to / unrelated를 삭제할 수 있습니다


Github 에는 프로젝트 페이지 라는 기능이있어 Github 에서 제공 할 파일을 제공하기 위해 프로젝트에 특정 이름의 브랜치를 생성 할 수 있습니다. 그들의 지시는 다음과 같습니다.

$ cd /path/to/fancypants
$ git symbolic-ref HEAD refs/heads/gh-pages
$ rm .git/index
$ git clean -fdx

거기에 빈 저장소가 있으며 새 저장소를 추가 할 수 있습니다.


현재 선택된 답변이 정확합니다. 우연히 추가 할 것입니다 ...

이것은 실제로 github.com이 사용자가라는 고아 브랜치를 통해 리포지토리에 대해 Github Pages를 만드는 방법 gh-pages입니다. 여기에 예쁜 단계가 설명되어 있습니다.

https://help.github.com/articles/creating-project-pages-manually

기본적으로이를 설정하는 git 명령은 다음과 같습니다.

  1. git checkout --orphan gh-pages (리포지토리에 gh-pages라는 부모없는 지점을 만드십시오)
  2. git rm -rf . (분기 작업 트리에서 파일을 제거합니다)
  3. rm '.gitignore' (gitignore조차도)
  4. 이제 웹 사이트 콘텐츠를 추가하고 (index.html 등 추가) 커밋하고 푸시하십시오.
  5. 이익.

또한 Github이 웹 사이트를 구축하는 데 사용하는 "프로젝트 사이트"의 소스가되도록 리포지토리에 / docs 폴더지정할 수도 있습니다.

도움이 되었기를 바랍니다!


때로는 프로젝트에서 빈 분기를 즉시 만들고 작업을 시작하고 싶을 때 다음 명령을 즉시 실행합니다.

git checkout --orphan unrelated.branch.name
git rm --cached -r .
echo "init unrelated branch" > README.md
git add README.md
git commit -m "init unrelated branch"

기존 컨텐츠가 이미 커밋 된 경우 " git rebase -i --root" 의 구현 이 시퀀서 기계를 더 많이 사용하도록 업데이트되었으므로 이제 (Git 2.18 Q2 2018) 해당 컨텐츠를 자체 새 고아 분기로 추출 할 수 있습니다 .

이 시퀀서는 이제 커밋 그래프의 전체 토폴로지를 다른 곳으로 이식 할 수있는 것 입니다.

참조 8fa6eea 커밋 , 9c85a1c 커밋 , ebddf39 커밋 , 21d0764 커밋 , d87d48b 커밋 , ba97aea 커밋 에 의해 (2018 5월 3일) (요하네스 Schindelin을 dscho) .
(가 합병 Junio C 하마노 - gitster-c5aa4bc을 투입 , 2018 (30) 5 월)

시퀀서 : 새로운 루트 커밋 도입 허용

--rebase-merges기존 분기 토폴로지를 자유롭게 변경할 수 있도록 특별히 설계된 모드와 관련하여 사용자는 새로 작성된 루트 커밋으로 시작하는 완전히 새로운 분기로 커밋을 추출 할 수 있습니다 .

이것은 이제 루트 커밋이되고 싶은 커밋을 수행 reset [new root]하기 전에 명령을 삽입함으로써 가능합니다 pick. 예:

reset [new root]
pick 012345 a commit that is about to become a root commit
pick 234567 this commit will have the previous one as parent

유효한 참조 이름이 아니기 reset때문에 다른 명령 사용과 충돌하지 않습니다. [new root]참조 이름에서 여는 괄호와 공백은 모두 불법입니다.


http://wingolog.org/archives/2008/10/14/merging-in-unrelated-git-branches 에서이 스크립트를 찾았으며 매우 잘 작동합니다!

#!/bin/bash

set -e

if test -z "$2" -o -n "$3"; then
    echo "usage: $0 REPO BRANCHNAME" >&2
    exit 1
fi

repo=$1
branch=$2

git fetch "$repo" "$branch"

head=$(git rev-parse HEAD)
fetched=$(git rev-parse FETCH_HEAD)
headref=$(git rev-parse --symbolic-full-name HEAD)

git checkout $fetched .

tree=$(git write-tree)

newhead=$(echo "merged in branch '$branch' from $repo" | git commit-tree $tree -p $head -p $fetched)
git update-ref $headref $newhead $head
git reset --hard $headref

참고 URL : https://stackoverflow.com/questions/1384325/in-git-is-there-a-simple-way-of-introducing-an-unrelated-branch-to-a-repository



반응형