git push添加以前跟踪的,现在未跟踪的目录

时间:2015-11-16 13:53:12

标签: git github gitignore

我想:

  • 取消跟踪之前跟踪的两个目录及其内容(输出/& mybuild /)
  • 从远程存储库中删除它们
  • 在这些目录中保留文件的本地副本

基于this post,我做了以下事情:

git rm -r --cached out/
git rm -r --cached mybuild/
git commit -m "Remove directories out/ & mybuild/"

我仍然希望远程存储库中有一个空的out /目录,但不需要mybuild /目录。因此,根据this post,我在存储库的主文件夹中添加了mybuild /到.gitignore,并在out /目录中创建了一个.gitignore文件,其中包含:

*
!.gitignore

并将空目录添加到存储库:

git add -f out/.gitignore
git commit -m "Add empty out/ directory"

在此之后,git ls-files不会在mybuild /目录中显示任何文件,只有.gitignore文件出现在out /目录中。 但是,将最后一次提交推送到远程存储库仍然包含这些目录中未跟踪的文件:

[user@host]$ git push origin newbranch
Counting objects: 251, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (210/210), done.
Writing objects: 100% (214/214), 280.57 MiB | 4.20 MiB/s, done.
Total 214 (delta 93), reused 0 (delta 0)
remote: error: GH001: Large files detected.
remote: error: File mybuild/src/file1.dat is 269.99 MB; this exceeds GitHub Enterprise's file size limit of 100.00 MB
remote: error: File out/file2.dat is 188.17 MB; this exceeds GitHub Enterprise's file size limit of 100.00 MB

我错过了什么?怎么能解决这个问题?

更新: db48x指出,由于不需要的目录在我的存储库中存在了很长时间,因此删除它们是一项非常重要的任务。 运行git filter-branch以删除与out /目录相关的所有缓存文件都不成功:检出先前的提交并运行git ls-files表明out /目录中的不需要的文件仍然存在。

在db48x的另一个解决方案之后,我检查了一个早先的提交,其中阻塞git push的大文件不存在(注意:它仍然包含很多不需要的文件在out /& amp; mybuild /目录 - 只是阻止git push的文件。然后创建一个新分支(名为minimal)并重复上述步骤以删除不需要的目录中的所有文件。这部分解决了这个问题:out /和mybuild /目录实际上已经消失,可以将'minimal'分支推送到远程存储库。

唯一的问题是将项目的源文件更新为最新版本。合并旧分支'newbranch'和'minimal'是成功的,git ls-files运行表明Git没有跟踪out /或mybuild /目录中的文件。然而,由于out /和mybuild /目录中的文件,git push origin minimal现在再次失败。

我不清楚git ls-filesgit push之间消息不一致的原因,并希望进一步诊断问题的方向。

1 个答案:

答案 0 :(得分:0)

从事物的外观来看,您已经正确地引入了删除这些文件的提交。但是,这些文件仍包含在之前的提交中,因此仍需要上传。

如果可以,请在错误添加这些目录之前检查提交并重新进行任何更改;这次确保不添加这些目录。然后使用git branch -f将分支标签移动到这些新提交。这将创建一个与旧名称相同的新分支,以及一些相同的历史记录。如果您已经推送了一些错误提交,那么推送这个新分支也需要-f参数来强制它更新远程分支。

跟进:

由于这不是最近的错误,你必须打破大枪。 Git有一个命令filter-branch,可以让你重写历史记录。查看此命令的help page,它将此方案作为第一个示例。请注意,执行此操作后,您的存储库中的每个提交都将被修改,因此一旦您推送了所有新分支,任何克隆存储库的人将不得不做一些工作来赶上,或者必须删除他们的克隆并重新创建它。