태그 보관물: git-commit

git-commit

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

현재 로컬 Git 저장소가 있는데 Github 저장소로 푸시합니다.

로컬 리포지토리에는 ~ 10 개의 커밋이 있으며 Github 리포지토리는 동기화 된 복제본입니다.

내가하고 싶은 일은 로컬 Git 리포지토리에서 모든 버전 기록을 제거하므로 리포지토리의 현재 내용이 유일한 커밋으로 표시되므로 리포지토리 내의 이전 버전의 파일은 저장되지 않습니다.

그런 다음 이러한 변경 사항을 Github에 푸시하고 싶습니다.

Git rebase를 조사했지만 특정 버전을 제거하는 데 더 적합한 것으로 보입니다. 또 다른 잠재적 해결책은 로컬 저장소를 삭제하고 새 저장소를 작성하는 것입니다.

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



답변

다음은 무차별 대입 방식입니다. 또한 저장소 구성을 제거합니다.

참고 : 리포지토리에 하위 모듈이있는 경우 작동하지 않습니다! 하위 모듈을 사용하는 경우 대화식 rebase 를 사용해야합니다.

1 단계 : 모든 기록 삭제 ( 백업이 있는지 확인합니다. 되돌릴 수 없음 )

cat .git/config  # note <github-uri>
rm -rf .git

2 단계 : 현재 콘텐츠만으로 Git 리포지토리 재구성

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

3 단계 : GitHub로 푸시

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


답변

나를 위해 일하고 하위 모듈을 계속 작동시키는 유일한 솔루션은

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의 모든 것을 추가하는 하나의 커밋으로 새로운 브랜치를 생성합니다. 다른 것을 변경하지 않으므로 완전히 안전합니다.


답변

커밋이 많은 경우 많은 작업으로 판명 될 수있는 다른 옵션은 대화 형 rebase입니다 (git 버전이 = = 1.7.12라고 가정).git rebase --root -i

편집기에 커밋 목록이 표시되면 :

  • 첫 번째 커밋에 대해 “pick”을 “reword”로 변경
  • 다른 커밋마다 “pick”을 “fixup”으로 변경

저장하고 닫습니다. 힘내 rebasing 시작합니다.

결국 당신은 새로운 루트 커밋을 갖게 될 것입니다. 루트 커밋은 그 뒤에 오는 모든 것들의 조합입니다.

장점은 리포지토리를 삭제할 필요가 없으며 다시 생각할 경우 항상 폴 백이 있다는 것입니다.

당신이 정말로 당신의 역사를 핵화하고 싶다면, 마스터를이 커밋으로 재설정하고 다른 모든 지점을 삭제하십시오.


답변

Larsmans 가 제안한 방법의 변형 :

untrackfiles 목록을 저장하십시오 :

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

git 구성을 저장하십시오.

mv .git/config /tmp/

그런 다음 larsmans의 첫 단계를 수행하십시오.

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/