Cách dễ dàng ™
Hóa ra đây là một cách thực hành phổ biến và hữu ích đến nỗi các lớp phủ của Git làm cho nó thực sự dễ dàng, nhưng bạn phải có một phiên bản Git mới hơn (> = 1.7.11 tháng 5 năm 2012). Xem phần phụ lục để biết cách cài đặt Git mới nhất. Ngoài ra, có một ví dụ thực tế trong phần hướng dẫn bên dưới.
Chuẩn bị repo cũ
cd <big-repo>
git subtree split -P <name-of-folder> -b <name-of-new-branch>
Lưu ý: <name-of-folder>
KHÔNG được chứa các ký tự đầu hoặc cuối. Chẳng hạn, thư mục có tên subproject
PHẢI được chuyển qua subproject
, KHÔNG./subproject/
Lưu ý cho người dùng Windows: Khi độ sâu thư mục của bạn> 1, <name-of-folder>
phải có dấu tách thư mục kiểu * nix (/). Chẳng hạn, thư mục có tên path1\path2\subproject
PHẢI được thông qua làpath1/path2/subproject
Tạo repo mới
mkdir ~/<new-repo> && cd ~/<new-repo>
git init
git pull </path/to/big-repo> <name-of-new-branch>
Liên kết repo mới với GitHub hoặc bất cứ nơi nào
git remote add origin <git@github.com:user/new-repo.git>
git push -u origin master
Dọn dẹp bên trong <big-repo>
, nếu muốn
git rm -rf <name-of-folder>
Lưu ý : Điều này để lại tất cả các tham chiếu lịch sử trong kho lưu trữ. Xem Phụ lục bên dưới nếu bạn thực sự lo lắng về việc đã cam kết mật khẩu hoặc bạn cần giảm kích thước tệp của bạn.git
thư mục .
...
Hướng dẫn
Đây là các bước tương tự như trên , nhưng làm theo các bước chính xác của tôi cho kho lưu trữ của tôi thay vì sử dụng<meta-named-things>
.
Đây là một dự án tôi có để triển khai các mô-đun trình duyệt JavaScript trong nút:
tree ~/node-browser-compat
node-browser-compat
├── ArrayBuffer
├── Audio
├── Blob
├── FormData
├── atob
├── btoa
├── location
└── navigator
Tôi muốn tách ra một thư mục btoa
, vào một kho Git riêng
cd ~/node-browser-compat/
git subtree split -P btoa -b btoa-only
Bây giờ tôi có một chi nhánh mới, btoa-only
chỉ có cam kết btoa
và tôi muốn tạo một kho lưu trữ mới.
mkdir ~/btoa/ && cd ~/btoa/
git init
git pull ~/node-browser-compat btoa-only
Tiếp theo tôi tạo một repo mới trên GitHub hoặc Bitbucket, hoặc bất cứ điều gì và thêm nó dưới dạng origin
git remote add origin git@github.com:node-browser-compat/btoa.git
git push -u origin master
Ngày hạnh phúc!
Lưu ý: Nếu bạn đã tạo một repo bằng a README.md
, .gitignore
và LICENSE
, bạn sẽ cần phải kéo trước:
git pull origin master
git push origin master
Cuối cùng, tôi sẽ muốn xóa thư mục khỏi repo lớn hơn
git rm -rf btoa
...
ruột thừa
Git mới nhất trên macOS
Để có phiên bản Git mới nhất bằng Homebrew :
brew install git
Git mới nhất trên Ubuntu
sudo apt-get update
sudo apt-get install git
git --version
Nếu điều đó không hoạt động (bạn có phiên bản Ubuntu rất cũ), hãy thử
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
Nếu vẫn không được, hãy thử
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
Cảm ơn rui.araujo từ các ý kiến.
Xóa lịch sử của bạn
Theo mặc định, việc xóa các tệp khỏi Git không thực sự xóa chúng, nó chỉ cam kết rằng chúng không còn ở đó nữa. Nếu bạn thực sự muốn xóa các tham chiếu lịch sử (nghĩa là bạn đã nhập mật khẩu), bạn cần thực hiện việc này:
git filter-branch --prune-empty --tree-filter 'rm -rf <name-of-folder>' HEAD
Sau đó, bạn có thể kiểm tra xem tệp hoặc thư mục của mình không còn hiển thị trong lịch sử Git hay không
git log -- <name-of-folder> # should show nothing
Tuy nhiên, bạn không thể "đẩy" xóa GitHub và tương tự. Nếu bạn thử, bạn sẽ gặp lỗi và bạn sẽ phải chịu git pull
trước khi bạn có thể git push
- và sau đó bạn quay lại để có mọi thứ trong lịch sử của mình.
Vì vậy, nếu bạn muốn xóa lịch sử khỏi "nguồn gốc" - nghĩa là xóa nó khỏi GitHub, Bitbucket, v.v. - bạn sẽ cần xóa repo và đẩy lại một bản sao được cắt tỉa của repo. Nhưng chờ đã - còn nhiều nữa ! - Nếu bạn thực sự lo lắng về việc thoát khỏi mật khẩu hoặc thứ gì đó tương tự, bạn sẽ cần phải cắt bớt bản sao lưu (xem bên dưới).
Làm .git
nhỏ hơn
Lệnh lịch sử xóa đã nói ở trên vẫn để lại một loạt các tệp sao lưu - bởi vì Git rất tốt trong việc giúp bạn không làm hỏng repo của bạn một cách tình cờ. Cuối cùng nó sẽ xóa các tập tin mồ côi trong nhiều ngày và tháng, nhưng nó sẽ để chúng ở đó trong một thời gian trong trường hợp bạn nhận ra rằng bạn đã vô tình xóa một cái gì đó bạn không muốn.
Vì vậy, nếu bạn thực sự muốn dọn sạch thùng rác để giảm kích thước bản sao của một repo ngay lập tức, bạn phải làm tất cả những thứ thực sự kỳ lạ này:
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
Điều đó nói rằng, tôi khuyên bạn không nên thực hiện các bước này trừ khi bạn biết rằng bạn cần phải - chỉ trong trường hợp bạn đã cắt tỉa thư mục con sai, bạn biết không? Các tập tin sao lưu không nên được sao chép khi bạn đẩy repo, chúng sẽ ở trong bản sao cục bộ của bạn.
tín dụng
git filter-branch
xem câu trả lời của tôi dưới đây.