쉬운 길 ™
이것은 Git의 대군 주가 실제로 쉽게 만들었던 일반적이고 유용한 관행이라는 것이 밝혀졌지만 Git의 최신 버전이 있어야합니다 (> = 1.7.11 May 2012). 최신 Git을 설치하는 방법 은 부록 을 참조하십시오 . 또한 아래 연습 에서 실제 예가 있습니다.
오래된 레포를 준비하십시오
cd <big-repo>
git subtree split -P <name-of-folder> -b <name-of-new-branch>
참고 : <name-of-folder>
선행 또는 후행 문자를 포함하지 않아야합니다. 예를 들어, 이름이 지정된 폴더는 NOT subproject
으로 전달되어야합니다.subproject
./subproject/
Windows 사용자를위한 참고 사항 : 폴더 깊이가 1보다 <name-of-folder>
크면 * nix 스타일 폴더 구분 기호 (/)가 있어야합니다. 예를 들어, 이름이 지정된 폴더 path1\path2\subproject
는 다음과 같이 전달되어야합니다.path1/path2/subproject
새로운 저장소를 만듭니다
mkdir ~/<new-repo> && cd ~/<new-repo>
git init
git pull </path/to/big-repo> <name-of-new-branch>
새 저장소를 GitHub 또는 어디에서나 연결
git remote add origin <git@github.com:user/new-repo.git>
git push -u origin master
정리 내측 <big-repo>
, 하면 원하는
git rm -rf <name-of-folder>
참고 : 이렇게하면 모든 기록 참조가 리포지토리에 남습니다. 실제로 암호를 커밋 한 것이 우려되거나 폴더 의 파일 크기를 줄여야하는 경우 아래 부록을 참조하십시오 .git
.
...
연습
이것들은 위와 같은 단계 이지만, 저장소 대신에 나의 정확한 단계를 따르는 것입니다 <meta-named-things>
.
다음은 노드에서 JavaScript 브라우저 모듈을 구현하기 위해 가지고있는 프로젝트입니다.
tree ~/node-browser-compat
node-browser-compat
├── ArrayBuffer
├── Audio
├── Blob
├── FormData
├── atob
├── btoa
├── location
└── navigator
단일 폴더를 btoa
별도의 Git 리포지토리로 분할하고 싶습니다.
cd ~/node-browser-compat/
git subtree split -P btoa -b btoa-only
이제 btoa-only
커밋 만 있고 btoa
새 리포지토리를 만들고 싶은 새 분기 가 있습니다.
mkdir ~/btoa/ && cd ~/btoa/
git init
git pull ~/node-browser-compat btoa-only
다음으로 GitHub 또는 Bitbucket 또는 새 항목에 새 저장소를 만들고 origin
git remote add origin git@github.com:node-browser-compat/btoa.git
git push -u origin master
행복한 날!
참고 : 당신이있는 REPO을 만든 경우 README.md
, .gitignore
그리고 LICENSE
먼저 당겨야합니다 :
git pull origin master
git push origin master
마지막으로 더 큰 저장소에서 폴더를 제거하고 싶습니다.
git rm -rf btoa
...
부록
macOS의 최신 Git
Homebrew를 사용하여 최신 버전의 Git을 얻으려면 :
brew install git
우분투의 최신 힘내
sudo apt-get update
sudo apt-get install git
git --version
그래도 작동하지 않으면 (오래된 버전의 우분투가 있음)
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
그래도 작동하지 않으면 시도하십시오
sudo chmod +x /usr/share/doc/git/contrib/subtree/git-subtree.sh
sudo ln -s \
/usr/share/doc/git/contrib/subtree/git-subtree.sh \
/usr/lib/git-core/git-subtree
의견에서 rui.araujo에게 감사합니다.
역사 지우기
기본적으로 Git에서 파일을 제거해도 실제로 제거되지는 않으며 더 이상 존재하지 않는다고 커밋합니다. 기록 참조를 실제로 제거하려면 (예 : 비밀번호를 커밋 한 경우) 다음을 수행해야합니다.
git filter-branch --prune-empty --tree-filter 'rm -rf <name-of-folder>' HEAD
그 후 파일이나 폴더가 더 이상 Git 히스토리에 나타나지 않는지 확인할 수 있습니다
git log -- <name-of-folder> # should show nothing
그러나 GitHub 등에 삭제를 "밀어 넣을"수는 없습니다 . 당신이 시도하면 오류가 발생하고 당신이 git pull
할 수 있기 전에해야 할 것입니다 git push
-그리고 당신은 다시 역사에 모든 것을 가지고 돌아갑니다.
따라서 "origin"에서 히스토리를 삭제하려면 GitHub, Bitbucket 등에서 히스토리를 삭제해야합니다. 리포지토리를 삭제하고 정리 된 리포지토리를 다시 푸시해야합니다. 그러나 기다리십시오- 더 있습니다 ! -비밀번호를 제거하는 데 관심이있는 경우 백업을 정리해야합니다 (아래 참조).
.git
작게 만들기
위에서 언급 한 delete history 명령은 여전히 많은 백업 파일을 남겨두고 있습니다 .Git은 실수로 저장소를 망치지 않도록 도와주는 데 너무 친절하기 때문입니다. 결국 며칠과 몇 달 동안 고아 파일을 삭제하지만 실수로 원하지 않는 것을 삭제했다는 사실을 알기 위해 잠시 동안 그대로 둡니다.
따라서 리포지토리 의 복제 크기 를 줄이기 위해 휴지통 을 비우 려면 즉시이 이상한 작업을 모두 수행해야합니다.
rm -rf .git/refs/original/ && \
git reflog expire --all && \
git gc --aggressive --prune=now
git reflog expire --all --expire-unreachable=0
git repack -A -d
git prune
즉, 잘못된 하위 디렉토리를 정리 한 경우를 대비하여이 단계를 수행하지 않는 것이 좋습니다. 리포지토리를 푸시 할 때 백업 파일이 복제되어서는 안되며 로컬 복사본에만 있습니다.
신용
git filter-branch
아래 답변 을 참조하십시오.