IT

새(그리고 비어 있음!)를 만드는 방법"뿌리" 지점?

itgroup 2023. 7. 17. 20:53
반응형

새(그리고 비어 있음!)를 만드는 방법"뿌리" 지점?

이 git 저장소에 새 "root" 브랜치를 정의하려고 합니다.루트 분기란 저장소의 다른 모든 분기와1 완전히 독립적인 분기를 의미합니다.

불행하게도, 그 약속조차도 (그것을 부르자.Arepo의 커밋 트리의 맨 아래에는 많은 파일이 포함되어 있습니다(이것은 이미 상당히 성숙한 프로젝트에서 초기화된 저장소였습니다).

이 말은 내가 주더라도A새 지부의 사무실로서<start-point>이 새로운 분기는 "깨끗한 슬레이트"에서 시작하지 않고, 오히려 커밋된 모든 파일을 포함합니다.A.

이 저장소에 완전히 비어 있는 분기를 만들 수 있는 방법이 있습니까?<start-point>에 가까운A가능한 한?


1참고로, 이것은 새 레포를 만드는 것과 같지 않습니다.여러 가지 이유로 인해 별도의 저장소가 필요하지 않습니다.


편집: 좋아요. vcsjons의 답변을 토대로 한 것은 다음과 같습니다.

# save rev of the current earliest commit
OLDBASE=$(git rev-list --max-parents=0 HEAD)

# create a new orphan branch and switch to it
git checkout --orphan newbranch
# make sure it's empty
git rm -rf .

# create a new empty commit in the new branch, and
# save its rev in NEWBASE
git commit --allow-empty -m 'base commit (empty)'
NEWBASE=$(git rev-list HEAD)

# specify $NEWBASE as the new parent for $OLDBASE, and
# run filter-branch on the original branch
echo "$OLDBASE $NEWBASE" > .git/info/grafts
git checkout master
git filter-branch

# NOTE: this assumes that the original repo had only one
# branch; if not, a git-filter-branch -f <branch> command
# need to be run for each additional branch.

rm .git/info/grafts

이 절차가 약간 관련되어 있지만, 최종 결과는 다음과 같은 역할을 할 수 있는 빈 기본 커밋입니다.<start-point>새로운 "깨끗한 슬레이트 지점"을 위해, 내가 해야 할 일은.

git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD)

앞으로는 항상 다음과 같은 새 리포지토리를 만들 것입니다.

git init
git commit --allow-empty -m 'base commit (empty)'

...첫 번째 커밋이 비어 있고 새로운 독립 지점을 시작하는 데 항상 사용할 수 있도록 합니다. (이것은 매우 드물게 필요한 시설이지만 쉽게 사용할 수 있도록 하는 것은 매우 간단합니다.)

사용--orphan분기를 생성할 때:

git checkout --orphan YourBranchName

이렇게 하면 커밋이 0인 새 분기가 생성되지만 모든 파일이 준비됩니다.그 시점에서 제거할 수 있습니다.
("제거": Agit reset --hard인덱스를 비우고 빈 작업 트리를 남깁니다.)

--orphan에 대한 자세한 정보는 체크아웃을 위한 man 페이지를 보세요.

허용된 답변에 추가하는 것이 좋습니다. 정리 상태로 되돌리는 가장 좋은 방법은 초기 빈 커밋을 만들어 나중에 분기를 설정하는 동안 쉽게 기본을 바꿀 수 있도록 하는 것입니다.또한 정리 상태를 원하기 때문에 그러면 안 되는 파일을 커밋했기 때문에 인덱스에서 제거해야 합니다.이를 염두에 두고 다음을 수행해야 합니다.

$ git checkout --orphan dev2
Switched to a new branch 'dev2'
$ git reset # unstage all the files, you probably don't want to commit all of them
$ git commit --allow-empty -m 'Initial empty commit'
[dev2 (root-commit) a515c28] Initial empty commit

이 저장소에 완전히 비어 있는 분기를 만들 수 있는 방법이 있습니까?

Git 2.28+와 함께 사용하는 실제 명령은 다음과 같습니다.

git switch --discard-changes --orphan newBranch
# or
git switch -f --orphan newBranch

git switch Git 2.23(2019년 8월)부터 사용할 수 있으며, 이전의 혼란스러운 명령어를 대체합니다.

하지만 저는 Git 2.28(2020년 3분기)을 추천하고 싶습니다.git switch --discard-changes --orphan해당 버전에서 최적화되었습니다.

commit 8d3e33d, commit 8186128(2020년 5월 21일)을 brian m. carlson()bk2204의 commit 8d를 참조하십시오.
(Junio C Hamano에 의해 합병됨 -- -- 2020년 6월 9일 44af로 확정)

builtin/checkout메타데이터 초기화 단순화

사인 오프 바이: 브라이언 칼슨.
리뷰 담당자: 데릭 스톨리

우리가 전화할 때init_checkout_metadatareset_tree,필터에 전달할 수 있도록 해당 커밋의 개체 ID를 전달하거나 커밋이 없는 경우 트리를 전달하고자 합니다.

우리는 체크아웃 코드의 다른 곳에서 발생할 수 있는 이 후자의 경우를 예상했지만, 여기서는 발생할 수 없습니다.

커밋 개체가 없는 유일한 경우는 다음을 사용하여 호출할 때입니다.--orphan.

또한 다음 중 하나를 사용하여 추가적으로 커밋 개체 없이 이 코드 경로만 히트할 수 있습니다.--force또는--discard-changes.

이러한 경우 커밋 트리로 체크아웃 메타데이터를 초기화하는 것은 의미가 없습니다.

  • 약속은 없고, 빈 나무만 있고, 그리고.
  • 파일이 없는 분기를 체크아웃할 때 파일이 번지지 않기 때문에 데이터를 절대 사용하지 않습니다.

이 경우 올바른 포인터 값이 필요하므로 all-zero 개체 ID를 전달합니다.

테스트:

git switch master
echo foo >foo.txt
git switch --discard-changes --orphan new-orphan2
git ls-files >tracked-files
# test_must_be_empty tracked-files

만약 당신이 git 2.23 또는 그 이상을 사용한다면 당신은 그리고 대신에 익숙해질 것입니다.git checkout그렇다면, 깃발은 이 답변에서 언급한 것과 같습니다.

git switch --orphan YourBranchHere

언급URL : https://stackoverflow.com/questions/15034390/how-to-create-a-new-and-empty-root-branch

반응형