簡體   English   中英

無法撤消Git中的文件

[英]Unable to undo a file in Git

我有一個奇怪的情況,在某些提交之后,文件在Git中保留修改,而我無法撤消它。

我們正在使用LFS,該文件是二進制文件。 LFS已安裝在我的計算機上,並已為存儲庫配置。

請注意:

C:\xyz\tip [master ≡ +0 ~1 -0 !]> git st
## master...origin/master
 M Dependencies/BSI/Debug/64/TFC80NET.dll
C:\xyz\tip [master ≡ +0 ~1 -0 !]> git reset --hard HEAD
Encountered 1 file(s) that should have been pointers, but weren't:
        Dependencies/BSI/Debug/64/TFC80NET.dll
HEAD is now at 9ffa900f53 Merged PR 7525: Adding relationship conditions only do not enable Save button
C:\xyz\tip [master ≡ +0 ~1 -0 !]> git co HEAD -- Dependencies/BSI/Debug/64/TFC80NET.dll
Encountered 1 file(s) that should have been pointers, but weren't:
        Dependencies/BSI/Debug/64/TFC80NET.dll
C:\xyz\tip [master ≡ +0 ~1 -0 !]>

到底是怎么回事? 如何解決?

如您所說,您顯示的輸出表明已配置LFS,以便它跟蹤有問題的文件。

但是,似乎已在文件已添加到存儲庫之后設置了此配置,因此該特定文件不受 LFS的控制。 LFS知道應該在該路徑下管理文件,但是它會看到該路徑中回購中實際引用的原始文件(而不是指針),因此Encountered 1 file(s) that should've been pointers, but weren't

git命令本身很可能已經完成了預期的任務[1],但是您還會收到這些警告,以告訴您LFS暫時無法執行其工作。

您可以很輕松地解決此“問題”。

git rm --cached Dependencies/BSI/Debug/64/TFC80NET.dll
git add Dependencies/BSI/Debug/64/TFC80NET.dll

這將導致文件重新登台,並且在重新分段時,LFS“干凈”過濾器會將其改組為LFS存儲庫,並用指針文件替換在索引中。

您可以提交更改,然后從該提交進行的操作將不會收到上述警告,並且不會將新版本的大文件直接提交到核心存儲庫中。 (這是否真的很重要,取決於此.dll是否發生了更改。這是您可能從LFS中獲得的最小最小值。)

但是,那是不行的 :它不會從核心存儲庫中刪除任何現有的.dll版本。 這意味着已經存在的膨脹將仍然存在。 克隆存儲庫的人仍然會為下載那些歷史參考版本的成本感到不安。

如果您想充分利用LFS,那將是重寫歷史記錄的關鍵,可以使用“ lfs migration”工具,BFG Repo Cleaner的lfs模式或自定義filter-branch腳本進行。 每一個都有其自身的問題和陷阱,因此您需要閱讀其中涉及的內容。

所有這些技術的共同之處在於,它們是清除歷史記錄的重寫,這將使存儲庫的所有現有克隆(以及可能依賴於特定提交ID值的任何工具或文檔)都無效。 因此,在進行此類重寫之前,有必要與使用回購協議的所有人進行協調。 (一種合理的做法是,讓所有人將所有更改都推向原點-即使不是處於完全合並的狀態;然后讓所有人放棄其本地克隆;然后進行重寫;然后讓所有人從新的數據庫中重新克隆-已清理的倉庫。)


[1]如果您深入研究,發現reset和checkout命令沒有還原索引和工作樹中的文件,則可能需要解決其他問題。

對於BheeMa提供的Google員工 此解決方案對我有效:

git lfs uninstall
git reset --hard
git lfs install
git lfs pull

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM