代码之家  ›  专栏  ›  技术社区  ›  JosanSun

如何使用gitignore删除上传到Github的文件[[副本]

  •  0
  • JosanSun  · 技术社区  · 6 年前

    我的存储库中有一些文件应该被忽略,我将它们添加到.gitignore中,但当然,它们不会从我的存储库中删除。

    所以我的问题是,是否有一个神奇的命令或脚本使用过滤器分支,可以重写我的历史,并删除所有这些文件容易?或者仅仅是一个命令,它将创建一个commit来删除它们?

    0 回复  |  直到 10 年前
        1
  •  539
  •   Samy Dindane    11 年前

    您可以手动将它们从存储库中删除:

    git rm --cached file1 file2 dir/file3
    

    或者,如果你有很多文件:

    git rm --cached `git ls-files -i --exclude-from=.gitignore`
    

    但这在Windows上的gitbash中似乎不起作用。它生成一条错误消息。以下方法效果更好:

    git ls-files -i --exclude-from=.gitignore | xargs git rm --cached  
    

    关于在没有这些文件的情况下重写整个历史,我非常怀疑是否有必要 自动的 真是太好了。
    我们都知道改写历史是不好的,不是吗?:)

        2
  •  431
  •   gtatr    4 年前

    不管操作系统是什么,一个更简单的方法就是

    git rm -r --cached .
    git add .
    git commit -m "Drop files from .gitignore"
    

    git add 会忽略 .gitignore .

    使用 --cached 选项将文件保存在文件系统中,因此您不会从磁盘中删除文件。

    注: 有人在评论中指出,您将丢失所有文件的历史记录。我在MacOS上用Git2.27.0进行了测试,结果是 这个案子。如果你想检查正在发生的事情,请检查你的 git diff HEAD~1 在你做出承诺之前。

        3
  •  170
  •   Brian Topping    8 年前

    作为文件 .git忽略 你可以使用 git清洁

    git clean -xdn 进行试运行并查看将要删除的内容。
    git clean -xdf

    基本上, git clean -h man git-clean (在unix中)将给您提供帮助。

    新文件 不在集结区的。

    希望有帮助。

        4
  •  6
  •   Scott Crossen    7 年前

    我用sed操作了.gitinore语句的输出,实现了一个非常简单的解决方案:

    cat .gitignore | sed '/^#.*/ d' | sed '/^\s*$/ d' | sed 's/^/git rm -r /' | bash

    说明:

    1. 打印.gitinore文件
    2. 删除所有空行
    3. 将“git rm-r”添加到行的开头
    4. 执行每一行。
        5
  •  0
  •   Tobias Kienzler    4 年前

    如果你真的想删减你的历史 .gitignore d文件,先保存 .git忽略 /tmp/.gitignore

    git filter-branch --force --index-filter \
        "git ls-files -i -X /tmp/.gitignore | xargs -r git rm --cached --ignore-unmatch -rf" \
        --prune-empty --tag-name-filter cat -- --all
    

    笔记:

    • git filter-branch --index-filter 运行在 .git 我认为目录,也就是说,如果你想使用一个相对路径,你必须多加一个前缀 ../ ../.gitignore ,实际 文件,它会由于某种原因(可能是在 git筛选器分支--索引筛选器 工作目录(被认为)是空的?)
    • 我想用类似的东西 git ls-files -iX <(git show $(git hash-object -w .gitignore)) 而是为了避免复制 .git忽略 但是它本身已经返回了一个空字符串(而 cat <(git show $(git hash-object -w .gitignore)) 确实是指纹 <(git show $GITIGNORE_HASH) 在里面 git filter-branch
    • 如果你真的只想 .git忽略 -清理特定分支,更换 --all 最后一行写着它的名字。这个 --tag-name-filter cat
        6
  •  0
  •   Alex Styl    3 年前

    在linux中,可以使用以下命令:

    例如,我想删除 *.py~ 所以我的命令应该是==>

    find . -name "*.py~" -exec rm -f {} \;

        7
  •  -4
  •   pensz    12 年前

    git将在您将其添加到.gitignore后忽略与.gitignore模式匹配的文件。

    但存储库中已经存在的文件仍将保留。

    使用 git rm files_ignored; git commit -m 'rm no use files' 删除忽略的文件。