OK, cuối cùng tôi đã tự tìm ra.
Phiên bản ngắn: Tôi đã sửa đổi cam kết trỏ đến đốm màu bị hỏng để xóa nó khỏi lịch sử.
Phiên bản dài: Tôi nghĩ rằng vì tôi đã biết tệp là gì và chỉ muốn biến nó khỏi biến, sau đó tôi có thể sửa đổi cam kết cũ. Tôi đã không thực sự mong đợi nó làm việc, nhưng cuối cùng nó đã làm.
Tôi phải chỉ ra rằng tôi đã loại bỏ các đốm màu trong .git/đối tượng trong việc thử những điều trước đó, và nó có thể quan trọng vào lý do tại sao nó hoạt động.
Trước tiên, tôi phải biết nó là gì. Cho rằng tôi sử dụng lệnh
git log --raw --all --full-history -- subdir/my-file
tôi thấy các cam kết được đặt tên 966a46 ....
Sau đó, tôi đã làm các bước để sửa đổi nó. Vì đó là một cam kết cũ, tôi đã sử dụng
git rebase -- interactive 966a46^
Trình chỉnh sửa của tôi có một dòng cho mỗi cam kết và tôi đã thay đổi "chọn" thành "chỉnh sửa" trước cam kết mà tôi muốn sửa đổi.
Lệnh git status
cho tôi thấy rằng tập tin tôi muốn xóa đã được sửa đổi:
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: subdir/my-file
tôi muốn loại bỏ nó khỏi các cam kết, vì vậy tôi đã làm rm subdir/my-file
. git status
sau đó hiển thị cho tôi:
# deleted: subdir/my-file
Điều này có vẻ đầy hứa hẹn. Vì vậy, tôi chỉ đơn giản là cam kết đã được sửa đổi cam kết và tiếp tục rebase:
git commit --all --amend
git rebase --continue
Nhưng sau khi đã rebased một vài cam kết nó thất bại với lỗi này:
error: could not apply 45c2315... did some fancy things
fatal: unable to read 95b6a826cadae849f4932a71d6735ab6ceb47cab
45c2315 là người đầu tiên cam kết, trong đó tập của tôi đã được sửa đổi sau khi đã được tạo. Vì nó không tìm thấy phiên bản trước của tập tin, nó chỉ thất bại.
git status
cho tôi thấy, trong số những thứ khác:
# Unmerged paths:
# (use "git reset HEAD <file>..." to unstage)
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# deleted by us: subdir/my-file
Tôi thực sự không chắc chắn những gì nó có nghĩa, nhưng điều này cam kết được cho là người đầu tiên trong đó các tập tin sẽ xuất hiện, sau khi sửa chữa. Vì vậy, tôi không muốn nó bị xóa, nhưng ngược lại, thêm vào cam kết! Vì vậy, tôi đã làm
git add subdir/my-file
Và chắc chắn git status
cho thấy đây là "tệp mới".
Sau đó, tôi đã thực hiện git rebase --continue
và mọi thứ diễn ra tốt đẹp và việc rebase thành công.
git push
diễn ra suôn sẻ thay vì thất bại về đốm màu bị vỡ.
Nhưng vẫn còn là một vấn đề, bởi vì git fsck
vẫn thất bại:
$ git fsck --full
Checking object directories: 100% (256/256), done.
broken link from tree 27e8e7d5b94c1dad5410a8204089828a167a0eaf
to blob 95b6a826cadae849f4932a71d6735ab6ceb47cab
Và git gc
thất bại quá, khi tôi hỏi ông tỉa tất cả mọi thứ. Vì vậy, tôi đã tìm ra được hành động tốt nhất là, vì tôi đã đẩy thành công trước đó, để sao chép mọi thứ trở lại trong một kho lưu trữ mới và làm việc từ đó.
Hãy thử xem một số giải pháp tại đây: http://stackoverflow.com/q/4254389/1031900 –
Câu hỏi này nói về một cây bị hỏng, có một chút khác biệt. Không ai trong số những câu trả lời này có thể giúp tôi, thật đáng buồn. Tôi sẽ thử một vài thứ và sẽ đăng nó ở đây nếu chúng hoạt động. –