簡體   English   中英

具有大文件的 Git 工作流程

[英]Git workflow with large files

我知道之前有人問過並討論過這個問題,但我找不到解決這個問題的正確工作流程。

假設我正在開發一個我想推送到 GitHub 的新項目。 經過幾次運行良好的提交和推送后,我繼續編碼和編輯,並在某些時候將一些大於 100MB 的大文件添加到我的項目中(不知道或記住這會在我嘗試推送時導致問題)下一步)。

所以我這樣做:

git add . 

之后我做:

git commit -m 'some commit message'

最后:

git push

現在我遇到了麻煩,因為我收到遠程錯誤:檢測到大文件。

那么我在這里有什么選擇 1. 保持我的項目更改和我添加的文件處於活動狀態 2. 從未來的提交中排除大文件文件。

我找到了使用git revert …刪除最后一次提交(我在其中添加了大文件等)的命令,但這不是我想要的,因為它還會從我的工作目錄中刪除所有工作。

對於您當前的問題,您想重新定位/編輯:

git rebase -i HEAD~1

其中“1”是您的 bigass 提交的提交次數。 例如,對於 3 次提交,我可能會得到一個 $EDITOR 接口,例如:

pick d187a63 Some bigass file and other stuff
pick d1dff5c Use https for remote service
pick e8a29cd Add honeybadger

# Rebase e99b72e..c564a67 onto e99b72e (       3 TODO item(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.

通過操作非注釋行,git 將對您的提交應用相應的操作。 在您的情況下,您希望將 bigass 提交的“pick”更改為“edit”。 然后,您將返回到處於中間變基狀態的命令行,您可以:

git rm bigass.file              # remove the file from the commit 
git commit good.file other.file # make additional commit(s) w/ just the stuff you want
git rebase --continue           # wrap up rebase

最后,考慮所有未提交的文件(通過刪除、排除或包含)和git rebase --continue

注意:您還可以使用.git/info/exclude在不影響.gitignore情況下忽略本地生成的文件。 您可以在那里使用您在.gitignore使用的相同條目,但它們永遠不會被推送到遠程或覆蓋。 當心:如果您錯誤地忽略了某些內容或忘記了您忽略的內容,這會讓您發瘋!

更廣泛地說,如果您確實打算對大文件進行版本控制,您可能有興趣修改您的工作流程以使用git-lfs (大文件存儲)來解決這個確切的問題。 它將內容哈希/指針存儲在 git 中,並將大量二進制文件存儲在雲數據存儲中。 它得到了GithubMicrosoft VSO (包括免費無限存儲)等的支持。

據我了解,最后一次提交包含更改和一個大文件的組合。 如果您恢復該提交,可能會使大文件看起來像消失了,但它仍然存在於歷史記錄中。 所以如果你推,你可能仍然有問題。 如果您想從歷史記錄中刪除大文件,但在該提交中保留其他更改,您可以對上次提交進行交互式 rebase 並編輯它以刪除大文件。

這實現了與 Joe A 的答案相同的效果,除了它更簡單,而且在我看來,對於不熟悉該地區的人來說,它更安全。

git reset --soft HEAD~
這將撤消提交,但將所有本應提交的內容保留為暫存狀態。
然后git rm不應該提交的文件,然后重新提交。
現在你應該可以推送了。

請注意,Joe 的回答在技術上沒有任何問題,我已經贊成; 對於這樣一個簡單的問題來說,這只是矯枉過正,而且過於復雜。 但是,如果您的提交鏈包含 n>1 次提交,Joe 的答案將是您的最佳選擇。 所以這更像是一種特殊情況,你可以做一些更安全的事情,因為這只是你的最后一次操作有問題。

暫無
暫無

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

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