使用大文件的Git工作流程

时间:2016-08-04 18:26:31

标签: git github

我知道这已经被问过并在前面讨论过了,但我找不到适合这个问题的工作流程。

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

所以我这样做:

git add . 

之后我做了:

git commit -m 'some commit message'

最后:

git push

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

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

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

3 个答案:

答案 0 :(得分:1)

对于您的直接问题,您想要改变/编辑:

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提交更改“选择”以“编辑”。然后,您将返回命令行,处于一个中间状态,您可以:

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中的same entries,但它们永远不会被推送到远程或覆盖。要注意:如果你不正确地忽略某些东西或忘记你忽略的东西,这会让你发疯!

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

答案 1 :(得分:0)

据我了解,最后一次提交有一组变化加上一个大文件。如果您还原该提交,可能会使大型文件看起来不见了,但它仍然存在于历史记录中。所以,如果你推,你可能仍然有问题。如果要从历史记录中删除大文件但在该提交中保留其他更改,则可以对该最后一次提交进行交互式rebase并编辑它以删除大文件。

答案 2 :(得分:0)

这实现了与Joe A的答案相同的效果,除了它更简单,并且在我看来,对于不熟悉该区域的人来说它更安全。

git reset --soft HEAD~
这将取消提交,但将所有已经提交的内容保留为暂存状态 然后git rm不应该提交的文件,然后重新提交 现在你应该能够推动。

请注意,Joe的回答中有技术上没有错误,我已经对它进行了投票;对于这样一个简单的问题,它只是矫枉过正而且过于复杂。但是,如果您的提交链包含n> 1,那么Joe的回答将是您的最佳选择。所以这更像是一个特殊情况,你可以做一些更安全的事情,因为它只是你最后一次操作有问题。

相关问题