这就是我所做的:
现在,在推动时我意识到文件太多了,因为有些文件是我不想推送的视频文件。所以我按Ctrl + C取消推送。
我意识到没有.gitignore文件,所以我被困在这里。
$ git status
# On branch new-branch
nothing to commit, working directory clean
所以,现在我想推送除.mp4视频文件(在很多子文件夹中)之外的所有文件,这些文件也已经在git中添加和提交了。
我该怎么办?
答案 0 :(得分:4)
您应首先从索引中删除视频:
git rm --cached path/to/videos/*.mp4
这样就保留了文件,它只是从git中删除它们 - 好像它们从未被添加到索引中一样。
现在你应该添加一个.gitignore
文件并将路径添加到那里的视频中,然后将其添加到git中:
git add .gitignore
现在你可以commit --amend
修改最近的提交:
git commit --amend
最后推:
git push origin branchname
顺便说一句,如果你已经推送到遥控器,你可以使用几乎相同的命令,除了你需要将-f
(--force
)选项添加到git push
。但是你需要确保没有其他人已经从遥控器中拉出来,否则你会搞砸了。
答案 1 :(得分:2)
使用git update-index
进行批量索引操作最简单,如下所示:
git ls-files \*.mp4 | git update-index --force-remove --stdin
修改你的承诺:
git commit --no-edit --amend
推它
git push --force origin # the server might not allow this
你很好。 git最终将清除垃圾,忘掉它并让它完成它的工作。
答案 2 :(得分:1)
这是你的情景。您错误地添加,提交,并推送了一堆mp4
个文件。我重新创建了一个类似的场景:
> git add -A
> git status
new file: a.mp4
new file: b.mp4
new file: c.mp4
new file: d.mp4
new file: e.mp4
new file: good-file.txt
new file: good-file1.txt
new file: good-file2.txt
new file: subdir/f.mp4
new file: subdir/subdir/g.mp4
> git commit -m "Add new files."
> git push
mp4
文件现在正在污染远程存储库。
请注意,您还推送了一些要保留在遥控器中的txt
个文件。要删除mp4
文件,请首先通过添加以下行来更新.gitignore(这假定您要忽略所有 mp4文件 - 否则您必须添加更多特定路径。)
*.mp4
然后运行以下git命令。首先,递归删除索引中的所有mp4
个文件。然后,修改你的最后一次提交;由于mp4
文件不再在索引中,因此它们不会在修改后的提交中。最后,强制将新的重写提交推送到远程上游。
> git rm --cached -r *.mp4
rm 'a.mp4'
rm 'a1.mp4'
rm 'a2.mp4'
rm 'bar.mp4'
rm 'foo.mp4'
rm 'subdir/foobar.mp4'
rm 'subdir/subdir/foofoo.mp4'
> git commit --amend -m "Add new files without mp4s"
> git push -f
结果:遥控器不再包含mp4
个文件。 警告:如果其他开发者已经撤回了您的第一次提交,则他们将不得不重写您的重写提示。