如何从git commit中删除文件

时间:2015-04-07 09:04:30

标签: git

偶然我在我的git提交中添加了一个大文件,我现在试图再次删除它。

来自https://help.github.com/articles/remove-sensitive-data/

我受到启发试试这个

git filter-branch --force --index-filter \'git rm --cached --ignore-unmatch .ntvs_analysis.dat' \--prune-empty --tag-name-filter cat -- --all

但我以

结束了操作
>_

我期待的是$。如果我输入'

我收到此错误

fatal: ambiguous argument 'rm': unknown revision or path not in the working tree
.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

我之后已经提交了一些我想保留的提交。如何从提交中删除大文件,以便我可以上传到github。

3 个答案:

答案 0 :(得分:1)

  1. 使用

    恢复到之前的git提交
    # Moves pointer back to previous HEAD
    git reset --soft HEAD@{1}
    
  2. 只需删除您的文件

    即可
    rm <filename>
    
  3. 然后再次提交您的更改

    git commit -a
    

答案 1 :(得分:1)

为了不丢失您添加的文件,您可以按照以下步骤操作:

  1. git reset --soft HEAD~1 - 这会将分支重置为上一个快照,同时保留所有文件暂存
  2. git reset HEAD file_to_remove - 这将从暂存
  3. 中删除test.txt
  4. git commit -a -m "commit message" - 重新提交暂存的更改,而不删除文件
  5. 只是一个重要的注意事项 - 上面假设您的提交未被推送到公共存储库(在这种情况下不建议使用git reset)

答案 2 :(得分:1)

问题是你转义了单引号以启动命令,因此--index-filter选项收到了单个参数'git。当您结束该行而不关闭您打算作为结束报价的未转义单引号时,>_是继续提示。由于git误解了所产生的参数序列而发生错误。正确的命令就是

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch .ntvs_analysis.dat' --prune-empty

(删除了第一个单引号和--prune-empty选项之前的反斜杠。我完全删除了--tag-filter,因为我不确定需要什么,尽管--tag-filter cat -- --all是几乎肯定不正确。)