处理大文件的 Git 工作流程

问题描述 投票:0回答:3

我知道之前已经有人询问和讨论过这个问题,但我找不到解决此问题的正确工作流程。

假设我正在开发一个新项目,我想将其推送到 GitHub。 经过几次运行良好的提交和推送后,我继续编码和编辑,在某个时候我向我的项目添加了一些大于 100MB 的大文件(不知道或没有记住,当我尝试推送时这会导致问题)下一步)。

所以我这样做:

git add . 

之后我会:

git commit -m 'some commit message'

最后:

git push

现在我遇到了麻烦,因为我收到远程错误:检测到大文件。

那么我的选择是什么:1. 保持项目更改和添加的文件处于活动状态;2. 从未来的提交中排除大文件。

我找到了用

git revert …
删除最后一次提交(我在其中添加了大文件等)的命令,但这不是我想要的,因为它还会删除我工作目录中的所有工作。

git git-push git-rebase git-revert
3个回答
1
投票

对于您眼前的问题,您想要重新调整/编辑:

git rebase -i HEAD~1

其中“1”是您的大提交的提交数量。例如,对于 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

注意:您还可以使用

.gitignore
忽略本地生成的文件而不影响
.git/info/exclude
。您可以在 .gitignore 中使用
相同的条目
,但它们永远不会被推送到远程或被覆盖。请注意:如果您错误地忽略了某些内容或忘记了您所忽略的内容,这可能会让您发疯!

更广泛地说,如果您想要打算对大文件进行版本控制,您可能有兴趣修改您的工作流程以使用git-lfs(大文件存储),以解决这个确切的问题。它将内容哈希/指针存储在 git 中,并将大量二进制文件存储在云数据存储中。它得到了 GithubMicrosoft VSO(包括免费无限存储)等的支持。


0
投票

这达到了与 Joe A 的答案相同的效果,只是它更简单,而且在我看来,对于不熟悉该地区的人来说更安全。

git reset --soft HEAD~

这将撤消提交,但保留所有已提交的内容。
然后
git rm
不应该提交的文件然后重新提交。
现在你应该能够推动了。

请注意,乔的答案技术上没有任何问题,我已经投了赞成票;对于这样一个简单的问题来说,这太过分了,而且过于复杂。但是,如果您的提交链包含 n>1 个提交,Joe 的答案将是您的最佳选择。因此,这更像是一种特殊情况,您可以做一些更安全的事情,因为这只是您最后一次操作出现问题。


0
投票

据我了解,最后一次提交包含更改组合和一个大文件。如果您恢复该提交,这可能会使大文件看起来已经消失,但它仍然存在于历史记录中。因此,如果你推动,你可能仍然会遇到问题。如果您想从历史记录中删除大文件,但保留该提交中的其他更改,您可以对上次提交进行交互式变基并编辑它以删除大文件。

© www.soinside.com 2019 - 2024. All rights reserved.