2010-07-25 24 views
5

Tôi bây giờ có một kho lưu trữ lớn, cồng kềnh, Git tiêu tốn dung lượng đĩa nhiều trên GitHub mà tôi muốn đưa vào chế độ ăn uống. Tôi cần phải loại bỏ các cam kết cổ xưa được thực hiện sớm trong lịch sử của dự án mà về cơ bản là không liên quan đến hướng hiện tại mà dự án đang thực hiện.git rebase. Tôi sử dụng nó như thế nào để Thu gọn các Reams của Commits cổ đại

Tôi - và sẽ luôn là - người dùng duy nhất của repo riêng tư này.

Lý tưởng nhất là tôi có thể làm một cái gì đó như:

git rebase từ-sinh-of-repo-đến-một-tháng-trước

Cảm ơn,
Doug

+0

bản sao có thể có của [Làm cách nào để kết hợp hai cam kết đầu tiên của kho lưu trữ Git?] (Http://stackoverflow.com/questions/435646/how-do-i-combine-the-first-two-commits- of-a-git-repository) Trong khi câu hỏi được liên kết ở đây cho biết về việc kết hợp chỉ hai cam kết, các công thức nấu ăn được mô tả ở đó cũng làm việc cho nhiều cam kết hơn. –

+0

Cảm ơn Pavel. Tôi sẽ kiểm tra. – dugla

+0

Bạn có muốn đè bẹp tất cả các cam kết đó thành một lần commit hay không, hoặc bạn có thực sự muốn loại bỏ các thay đổi mà mỗi lần giới thiệu không? Dựa trên ý kiến ​​của bạn rằng bạn muốn "loại bỏ" và dự án đang đi theo một hướng khác, nó không hoàn toàn rõ ràng với tôi. – masonk

Trả lời

2

Thực ra, tôi sẽ đi với nhàm chán cũ git rebase -i HEAD ~ Số nơi Number sẽ đưa tôi trở lại từ đầu đến cam kết nội tâm. Mất nhiều thời gian hơn nhưng ít nhất tôi có một sự hiểu biết mơ hồ về những gì nó đang làm. Cảm ơn tất cả những lời đề nghị.

1

Dưới đây là một công thức mà sẽ làm việc trong Git 1.7.2 hoặc mới hơn:

 
start=$starting_sha1 
git checkout --orphan new_master $start 
git commit -m 'new root' 
git rebase --onto new_master $start master 
git checkout master 
git reset --hard new_master 
git push -f origin master 

Làm sạch các đối tượng cũ mà bạn không còn tham chiếu là công việc nữa, vì chúng c Ould được trỏ đến bởi reflogs, stash, thẻ, chi nhánh khác, vv Một khi bạn chắc chắn chúng được cố định hoặc loại bỏ, một hoặc nhiều điều sau đây sẽ giúp:

 
git prune 
git gc 
git repack -ad 
7

Các --squash tùy chọn để có thể git merge hữu ích, và có sẵn trong git 1.4.1 và sau đó. Giai đoạn này ảnh hưởng của việc hợp nhất, nhưng không tạo ra một cam kết. Vì vậy, nếu 143eff là lâu đời nhất hành bạn muốn bao gồm trong bị đè nén cam kết, chi nhánh hiện tại của bạn là master và "một tháng trước" cam kết là dcb7e5, bạn có thể làm:

# Save the old position of "master" by creating a branch old-master: 
$ git checkout master 
$ git branch old-master 

# Create and checkout a branch called "new-master" that's at the old commit: 
$ git checkout -b new-master 143eff 

# Stage the effects of merging the "one month ago" commit: 
$ git merge --squash dcb7e5 
Updating 143eff3..dcb7e5b 
Fast-forward 
Squash commit -- not updating HEAD 
[... status output showing the staged changes ..] 

# Create the squashed commit: 
$ git commit -m "A commit squashing history up to a month ago" 
# (You could use --amend if you want them to be squashed into 143eff 
# instead of being a commit after that.) 

Bây giờ bạn có thể kiểm tra với git diff dcb7e5 new-master rằng chúng thực sự giống nhau.

Tiếp theo, bạn muốn rebase phần còn lại của công việc của bạn lên mới bị Thạc sỹ:

$ git rebase --onto new-master dcb7e5 master 

Điều đó sẽ để lại cho bạn trên rebased master mà cần phải có lịch sử bạn muốn. lịch sử (Một lần nữa, bạn có thể kiểm tra điều này với git diff old-master mastergit log Khi đẩy tổng thể để GitHub bạn sẽ cần phải thêm --force kể từ khi bạn đã viết lại:.

# Push master to github, with "--force", since you've rewritten history: 
$ git push --force origin master 

Bây giờ bạn có thể loại bỏ new-master, mà là ở squash cam kết, với:

git branch -d new-master 

Rõ ràng github chạy git gc --auto trên push, vì vậy bạn sẽ thấy một số không gian tiết kiệm sớm ...

+0

Điều này làm việc như một say mê - cảm ơn Mark! – Itay

Các vấn đề liên quan