有选择地推送已添加和提交的文件

时间:2015-02-20 01:03:45

标签: git

这就是我所做的:

  1. 克隆了一个git存储库。
  2. 对文件进行了一些更改。
  3. 创建了一个新分支,检查了分支。
  4. 添加了文件,提交了更改,然后推送了更改。
  5. 现在,在推动时我意识到文件太多了,因为有些文件是我不想推送的视频文件。所以我按Ctrl + C取消推送。

    我意识到没有.gitignore文件,所以我被困在这里。

    $ git status
    # On branch new-branch
    nothing to commit, working directory clean
    

    所以,现在我想推送除.mp4视频文件(在很多子文件夹中)之外的所有文件,这些文件也已经在git中添加和提交了。

    我该怎么办?

3 个答案:

答案 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个文件。 警告:如果其他开发者已经撤回了您的第一次提交,则他们将不得不重写您的重写提示。