programing

현재 커밋을 Git 저장소에서 유일한 (초기) 커밋으로 하시겠습니까?

stoneblock 2023. 4. 9. 21:03

현재 커밋을 Git 저장소에서 유일한 (초기) 커밋으로 하시겠습니까?

저는 현재 로컬 Git 저장소를 가지고 있으며, Github 저장소에 푸시하고 있습니다.

로컬 저장소에는 최대 10개의 커밋이 있으며 Github 저장소는 이와 동기화된 복제품입니다.

로컬 Git 저장소에서 버전 이력을 모두 삭제하여 저장소의 현재 내용이 유일한 커밋으로 표시되도록 합니다(따라서 저장소 내의 이전 버전은 저장되지 않습니다.

그럼 이 변경 사항을 Github에 적용하겠습니다.

Git rebase를 조사했습니다만, 이것은 특정 버전을 삭제하는 것이 더 적합하다고 생각됩니다.또 하나의 잠재적인 해결책은 로컬 레포(repo)를 삭제하고 새로운 레포(repo)를 작성하는 것입니다.다만, 많은 작업이 필요하게 됩니다.

ETA: 추적되지 않은 특정 디렉토리/파일이 있습니다. 가능하다면 이러한 파일의 추적되지 않은 상태를 유지하고 싶습니다.

이게 바로 무차별적인 접근법입니다.저장소 구성도 제거됩니다.

참고: 저장소에 하위 모듈이 있는 경우 이 기능은 작동하지 않습니다.서브모듈을 사용하는 경우 인터랙티브한 기본 재배치 등을 사용해야 합니다.

순서 1: 모든 이력 삭제(백업이 있는지 확인합니다.복귀할 수 없습니다)

cat .git/config  # save your <github-uri> somewhere
rm -rf .git

2단계: 현재 콘텐츠만으로 Git repo를 재구축소

Before step 2 if you have not set up 스텝 2 이전에 셋업하지 않은 경우init.defaultBranch configuration then, please do it via 그럼, 설정을 실시해 주세요.git config --global init.defaultBranch <branch-name> you may choose 선택하실 수 있습니다.main as ~하듯이<branch-name>현재 예제에서

git init
git add .
git commit -m "Initial commit"

3단계: GitHub으로 이동합니다.

git remote add origin <github-uri>
git push -u --force origin main

(서브모듈을 계속 작동시키는) 유일한 솔루션은

git checkout --orphan newBranch
git add -A  # Add all files and commit them
git commit
git branch -D master  # Deletes the master branch
git branch -m master  # Rename the current branch to master
git push -f origin master  # Force push master branch to github
git gc --aggressive --prune=all     # remove the old files

제 중 삭제.git/나는 내가 제출할 때 엄청난 문제를 야기한다.서브모듈이 있으면 항상 큰 문제가 발생합니다.「」를 사용합니다.git rebase --root어떤 식으로든 나에게 갈등을 일으킬 것이다(그리고 나는 많은 역사를 가지고 있기 때문에).

다음은 제가 선호하는 접근법입니다.

git branch new_branch_name $(echo "commit message" | git commit-tree HEAD^{tree})

그러면 HEAD의 모든 것을 추가하는 하나의 커밋으로 새로운 브랜치가 생성됩니다.다른 건 변하지 않기 때문에 안전합니다.

커밋이 많으면 많은 작업이 될 수 있는 다른 옵션은 인터랙티브 리베이스입니다(git 버전은 >=1.7.12).git rebase --root -i

커밋 목록이 편집기에 표시될 때:

  • 첫 번째 커밋에 대해 "pick"을 "reword"로 변경합니다.
  • 다른 커밋마다 '픽'을 '픽업'으로 변경

저장하고 닫습니다.Git이 기본 설정을 시작합니다.

마지막에 새로운 루트 커밋이 생성됩니다.이 커밋은 루트 커밋 이후에 이루어진 모든 커밋을 조합한 것입니다.

장점은 저장소를 삭제할 필요가 없고, 다시 생각해도 항상 예비품이 있다는 것입니다.

이력을 축소하려면 마스터를 이 커밋으로 리셋하고 다른 브랜치를 모두 삭제하십시오.

Larsman이 제안하는 방법의 변형:

트랙 해제 파일 목록 저장:

git ls-files --others --exclude-standard > /tmp/my_untracked_files

git 설정을 저장합니다.

mv .git/config /tmp/

그런 다음 대규모 작업자의 첫 번째 단계를 수행합니다.

rm -rf .git
git init
git add .

설정을 복원합니다.

mv /tmp/config .git/

추적되지 않은 파일 추적 해제:

cat /tmp/my_untracked_files | xargs -0 git rm --cached

다음으로 커밋:

git commit -m "Initial commit"

마지막으로 저장소에 푸시합니다.

git push -u --force origin master

아래는 @Zeelot의 답변을 개작한 스크립트입니다.마스터 브랜치뿐만 아니라 모든 브랜치에서 이력을 삭제합니다.

for BR in $(git branch); do   
  git checkout $BR
  git checkout --orphan ${BR}_temp
  git commit -m "Initial commit"
  git branch -D $BR
  git branch -m $BR
done;
git gc --aggressive --prune=all

목적에 맞게 동작했습니다(서브모듈을 사용하지 않습니다).

얕은 클론을 사용할 수 있습니다(git > 1.9).

git clone --depth depth remote-url

자세한 것은, http://blogs.atlassian.com/2014/05/handle-big-repositories-git/ 를 참조해 주세요.

됩니다.master에 백업을

git branch tmp_branch $(echo "commit message" | git commit-tree HEAD^{tree})
git checkout tmp_branch
git branch -D master
git branch -m master
git push -f --set-upstream origin master

이는 @dan_waterworth의 답변을 기반으로 합니다.

로컬 Git 저장소에서 버전 이력을 모두 삭제하여 저장소의 현재 내용이 유일한 커밋으로 표시되도록 합니다(따라서 저장소 내의 이전 버전은 저장되지 않습니다.

보다 개념적인 답변:

커밋을 커밋을 으로 수집합니다.된 새로운 「」 「」 「/」 「」 「」 「」 「」통칙상 브랜치에서는 브런치를 허가합니다.master을 사용하다

오래된 도달 불가능한 커밋은 낮은 수준의 git 명령어를 사용하여 파헤치지 않는 한 그 누구도 다시 볼 수 없습니다.그 정도면 괜찮으시다면, 저는 그냥 멈춰서 자동 GC가 하고 싶을 때 언제든지 일을 하도록 하겠습니다.지금 당장 없애고 싶다면, 그것을 사용할 수 있다.git gc 함께)--aggressive --prune=all리모트 git 저장소의 경우 셸 액세스 권한이 없는 한 강제할 수 없습니다.

Github repo를 삭제하고 새로 만듭니다.가장 빠르고 쉽고 안전한 접근법입니다.즉, 단일 커밋을 사용하는 마스터 브랜치만 필요한 경우 허용되는 솔루션에서 이러한 모든 명령어를 실행하면 무엇을 얻을 수 있을까요?

git filter-branch주요 도구입니다.

git filter-branch --parent-filter true -- @^!

--parent-filter 쓴 .unix "stdin" stdout" 은 stdout" 입니다.true아무 것도 출력하지 않아서 부모가 없는 거죠 @^!Git의 줄임말로 "머리는 커밋하지만 부모는 커밋하지 않는다"의 의미입니다.그런 다음 다른 모든 ref를 삭제하고 천천히 밀어주세요.

다음 방법은 정확하게 재현할 수 있으므로 양쪽이 일치하면 클론을 다시 실행할 필요가 없습니다.다른 쪽에서도 스크립트를 실행합니다.

git log -n1 --format=%H >.git/info/grafts
git filter-branch -f
rm .git/info/grafts

정리하려면 다음 스크립트를 사용해 보십시오.

http://sam.nipl.net/b/git-gc-all-ferocious

저장소의 각 브랜치에 대해 "이력을 죽인다"는 스크립트를 작성했습니다.

http://sam.nipl.net/b/git-kill-history

참고 항목: http://sam.nipl.net/b/confirm

여기 있습니다.

#!/bin/bash
#
# By Zibri (2019)
#
# Usage: gitclean username password giturl
#
gitclean () 
{ 
    odir=$PWD;
    if [ "$#" -ne 3 ]; then
        echo "Usage: gitclean username password giturl";
        return 1;
    fi;
    temp=$(mktemp -d 2>/dev/null /dev/shm/git.XXX || mktemp -d 2>/dev/null /tmp/git.XXX);
    cd "$temp";
    url=$(echo "$3" |sed -e "s/[^/]*\/\/\([^@]*@\)\?\.*/\1/");
    git clone "https://$1:$2@$url" && { 
        cd *;
        for BR in "$(git branch|tr " " "\n"|grep -v '*')";
        do
            echo working on branch $BR;
            git checkout $BR;
            git checkout --orphan $(basename "$temp"|tr -d .);
            git add -A;
            git commit -m "Initial Commit" && { 
                git branch -D $BR;
                git branch -m $BR;
                git push -f origin $BR;
                git gc --aggressive --prune=all
            };
        done
    };
    cd $odir;
    rm -rf "$temp"
}

개최지 : https://gist.github.com/Zibri/76614988478a076bbe105545a16ee743

다음은 Github 저장소의 이력을 클리어하는 단계입니다.

먼저 .git에서 이력을 삭제합니다.

rm -rf .git

현재 콘텐츠에서만 git 저장소를 다시 만듭니다.

git init
git add .
git commit -m "Initial commit"

기록을 덮어쓰도록 Github 원격 저장소로 푸시합니다.


git remote add origin git@github.com:<YOUR ACCOUNT>/<YOUR REPOS>.git
git push -u --force origin master

모든 답변이 훌륭하지만 간단한 명령어를 사용하여 다른 접근 방식을 도입하고 싶다.

git clone --depth 1 <remote-url> .
git commit --amend -m <commit message you want>
git push --force

했습니다..git인텔리J를 통해 버전 관리로 재통합할 수 있습니다. ★★★★★★.git폴더가 숨겨져 있습니다.볼 수 .ls -a 지우다를 사용해서 .rm -rf .git.

그러기 위해서는 얕은 클론 명령어 git clone --depth 1 URL을 사용합니다.저장소의 현재 HEAD만 복제됩니다.

git에서 마지막 커밋을 제거하려면 단순히 실행하기만 하면 됩니다.

git reset --hard HEAD^ 

위에서 여러 개의 커밋을 삭제할 경우 실행할 수 있습니다.

git reset --hard HEAD~2 

마지막 2개의 커밋을 삭제합니다.수를 늘려 더 많은 커밋을 제거할 수 있습니다.

자세한 것은 이쪽.

Git 튜토리얼은 저장소를 삭제하는 방법에 대한 도움말을 제공합니다.

파일을 이력에서 삭제하고 .timeoutignore에 추가하여 실수로 다시 복사되지 않도록 해야 합니다.이 예에서는 GitHub gem 저장소에서 Rakefile을 삭제합니다.

git clone https://github.com/defunkt/github-gem.git

cd github-gem

git filter-branch --force --index-filter \
  'git rm --cached --ignore-unmatch Rakefile' \
  --prune-empty --tag-name-filter cat -- --all

이 파일을 이력에서 삭제했으므로 다시 실수로 커밋하지 않도록 합니다.

echo "Rakefile" >> .gitignore

git add .gitignore

git commit -m "Add Rakefile to .gitignore"

리포지토리 상태에 만족하는 경우 변경 사항을 강제로 푸시하여 원격 리포지토리를 덮어쓸 수 있습니다.

git push origin master --force

언급URL : https://stackoverflow.com/questions/9683279/make-the-current-commit-the-only-initial-commit-in-a-git-repository