2011-10-04 15 views
126

Tôi có cùng một câu hỏi như hỏi ở đây: New git repository in root directory to subsume an exist repository in a sub-directoryXóa refs/original/heads/master khỏi git repo sau khi lọc-branch --tree-filter?

Tôi đi theo câu trả lời này ở đây: New git repository in root directory to subsume an exist repository in a sub-directory

Bây giờ, gitk --all cho thấy hai lịch sử: một đỉnh cao trong hiện tại master, và một trong những tên original/refs/heads/master.

Tôi không biết lịch sử thứ hai này là gì hoặc cách xóa lịch sử thứ hai khỏi repo. Tôi không cần hai lịch sử trong kho lưu trữ của mình.

Làm cách nào để loại bỏ nó?

Để tái tạo bản thân:

mkdir -p project-root/path/to/module 
cd project-root/path/to/module 
mkdir dir1 dir2 dir3 
for dir in * ; do touch $dir/source-file-$dir.py ; done 
git init 
git add . 
git commit -m 'Initial commit' 

Bây giờ chúng ta có vấn đề poster gốc. Hãy di chuyển thư mục gốc của repo git để dự án gốc bằng cách sử dụng câu trả lời liên kết ở trên:

git filter-branch --tree-filter 'mkdir -p path/to/module ; git mv dir1 dir2 dir3 path/to/module' HEAD 
rm -rf path 
cd ../../../ # Now PWD is project-root 
mv path/to/module/.git . 
git reset --hard 

Bây giờ, nhìn thấy vấn đề hiện tại của tôi:

gitk --all & 
git show-ref 

Làm thế nào để thoát khỏi refs/original/heads/master và tất cả lịch sử liên quan ?

+1

thể trùng lặp của [Làm thế nào để xóa lịch sử cũ sau khi chạy lọc git -branch?] (http://stackoverflow.com/questions/5984428/how-to-delete-the-old-history-after-running-git-filter-branch) – user

Trả lời

213

refs/original/* là bản sao lưu, trong trường hợp bạn làm hỏng nhánh lọc của mình. Hãy tin tôi, đó là một ý tưởng hay là thực sự là.

Khi bạn đã kiểm tra các kết quả, và bạn đang rất tự tin rằng bạn có những gì bạn muốn, bạn có thể loại bỏ các sao lưu ref:

git update-ref -d refs/original/refs/heads/master 

hoặc nếu bạn đã làm điều này nhiều refs, và bạn muốn xóa sạch tất cả ra:

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d 

(đó là lấy trực tiếp từ manpage filter-branch.)

này không áp dụng đối với bạn, nhưng để người khác có thể tìm thấy điều này: Nếu bạn làm một bộ lọc-cám ch xóa nội dung chiếm dung lượng đĩa đáng kể, bạn cũng có thể muốn chạy git reflog expire --expire=now --allgit gc --prune=now để hết hạn chỉnh sửa và xóa các đối tượng hiện không sử dụng. (Cảnh báo:. Hoàn toàn, hoàn toàn không thể đảo ngược Hãy rất chắc chắn trước khi bạn làm điều đó.)

+0

Sau khi cập nhật, reflog hết hạn và gc , cả hai tệp này vẫn tham chiếu đến tham chiếu gốc: .git/info/refs và .git/packed-refs Có vẻ như có thể nói thay vào đó: 'git update-ref -d refs/original/refs/heads/master' – lhunath

+1

Tôi đoán bạn vô tình trộn thứ e từ: Nếu tôi đúng, nó phải là 'git update-ref -d gốc/refs/heads/master'? Tuy nhiên, chỉ lệnh thứ hai của bạn làm việc cho tôi. – JJD

+4

Đó là 'git update-ref -d refs/original/refs/heads/master' btw. Bạn có thể thấy tên đầy đủ bằng cách sử dụng 'git show-ref'. – poke

4

Và nếu bạn đang ở trong Windows PowerShell:

git for-each-ref --format="%(refname)" refs/original/ | foreach-object -process { git update-ref -d $_ }