完全删除已删除的文件在git仓库中被推送到master

时间:2010-12-02 19:42:34

标签: git

我已经下载了一个大型avi文件。我错误地将它下载到我本地系统上的git repo中。在做了一些提交后,我意识到文件在那里并删除了文件而没有考虑以后当我在服务器上推送到主服务器时会发生什么。毋庸置疑,git repo想要将已经版本化的“已删除”文件推送到服务器。

我似乎无法记住文件的名称。我所知道的是它有一个.avi扩展名。我想要的是关于如何在git仓库中追踪文件以及如何将其从推送到掌握中删除的建议。

感谢, 马修

5 个答案:

答案 0 :(得分:1)

进行了一些搜索,发现如果你运行这个命令,它应该搜索所有已删除的文件,然后搜索它们。

git ls-files --deleted | xargs git rm

答案 1 :(得分:0)

看看有什么遗漏..

git status

然后删除

git rm filename.avi

答案 2 :(得分:0)

git filter分支删除文件。注意,从添加文件的位置开始,您将拥有不同的SHA-1。

答案 3 :(得分:0)

使用git log --stat标识添加文件的提交的提交哈希。 --stat将帮助您查看每次提交中添加/删除的文件,并确定avi文件的路径。将其隐藏在$FILENAME中。然后

git filter-branch --index-filter 'git rm --cached --ignore-unmatch $FILENAME' HEAD

答案 4 :(得分:0)

马特,

你有没有推过你的回购并有人消费它?如果不是......更重要的是,如果您的历史记录仍属于您自己的历史记录,那么您需要 rebase 来重写您的历史记录。假设我有一个回购,例如以下简单历史记录:

$ git log --summary --stat
001d888 Yet some more work (Fred - 71 seconds ago)

 file2.txt |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
3f74e79 Doing some more work (Fred - 2 minutes ago)

 file1.txt |    1 +
 file3.txt |    1 +
 2 files changed, 2 insertions(+), 0 deletions(-)
8acc3d8 Adding some more files (Fred - 3 minutes ago)

 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file1.txt
 create mode 100644 file2.txt
 create mode 100644 file3.txt
fb3a2e1 Just added a big ole file (Fred - 4 minutes ago)

 BigOleFile.blob |  Bin 0 -> 33214460 bytes
 1 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 BigOleFile.blob
6d0ab2b first commit (Fred - 8 minutes ago)

 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README

想象一下,BigOleFile.blob是你的大文件......

要重写历史记录,请在要删除的记录之前获取提交的sha。在这种情况下,它是:

6d0ab2b

如果你的git日志很疯狂,请按照以下内容对其进行过滤,然后仍然为您提供匹配的背景信息:

git log --summary --stat |  grep avi --context=10

现在使用交互式选项 rebase 您的历史记录。

$ git rebase --interactive 6d0ab2b

你会得到这样的东西:

pick fb3a2e1 Just added a big ole file
pick 8acc3d8 Adding some more files
pick 3f74e79 Doing some more work
pick 001d888 Yet some more work

# Rebase 6d0ab2b..001d888 onto 6d0ab2b
#
# 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 <cmd>, exec <cmd> = Run a shell command <cmd>, and stop if it fails
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

删除具有添加文件的sha的行...在这种情况下,它是第一行。在重新定位会话期间,您将不得不经历几次提示,但它可能相当干净,您将会侥幸逃脱。完成后,您将收到消息:

Successfully rebased and updated refs/heads/master.

再次查看git日志以确保:

$ git log --summary --shortstat
7c499bb Yet some more work (Fred - 12 minutes ago)

 1 files changed, 1 insertions(+), 0 deletions(-)
4dfa303 Doing some more work (Fred - 13 minutes ago)

 2 files changed, 2 insertions(+), 0 deletions(-)
2f27c1b Adding some more files (Fred - 14 minutes ago)

 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file1.txt
 create mode 100644 file2.txt
 create mode 100644 file3.txt
6d0ab2b first commit (Fred - 19 minutes ago)

 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README

之后推动掌握:

$ git push origin master
Counting objects: 9, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (8/8), 751 bytes, done.
Total 8 (delta 2), reused 0 (delta 0)
To git@github.com:xxxxxxxxxxx/temp.git
   6d0ab2b..7c499bb  master -> master

正如你所看到的......文件全部消失了 - 再见。