我把以前由 Git 跟踪的文件放在.gitignore 列表中. 但是,文件在编辑后仍然显示在 git 状态。


当前回答

要总结一下:

您的应用程序正在寻找一个被忽略的文件 config-overide.ini 并使用它在承诺的文件 config.ini (或替代,寻找 ~/.config/myapp.ini,或 $MYCONFIGFILE) 承诺文件 config-sample.ini 并忽略文件 config.ini,有脚本或类似的复制文件如有必要。

其他回答

我用 git filter-branch 完成了这一点,我所使用的准确命令从 man 页面上取出:

警告:此将从您的整个历史中删除文件

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

这个命令将恢复整个命令历史,在每个命令之前执行 git rm 以便摆脱所指定的文件. 不要忘记在运行命令之前备份它,因为它将失去。

.gitignore 将防止未跟踪的文件添加(没有添加 -f)到 Git 跟踪的文件集,但是, Git 将继续跟踪已跟踪的任何文件。

要停止跟踪文件,我们必须从指数中删除文件:

git rm --cached <file>

要重新删除文件夹和文件中的所有文件:

git rm -r --cached <folder>

将文件从主审查中删除,将在下一个任务中进行。

警告:虽然这不会从您的本地机器中删除物理文件,但它会在下一个 git 拖动时将从其他开发人员的机器中删除文件。

如果你不想使用 CLI 并在 Windows 上工作,一个非常简单的解决方案是使用 TortoiseGit. 它在菜单中有“删除(保持本地)”操作,它工作得很好。

什么不为我工作

(在Linux下),我想使用这里的帖子,建议Ls - 文件 - 被忽略 - 排除 - 标准 - xargs git rm -r - 被捕的方法。

git ls-files --ignored --exclude-standard | xargs -d"\n" git rm --cached
git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

处理此情况(获取未找到文件的错误)。

所以我提供

git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached
git commit -am "Remove ignored files"

这使用 -z 对 ls 文件的论点,以及 -0 对 xargs 的论点,以便在文件名中安全/正确地输入“不良”字符。

在 git-ls-file(1)的手册页面上,它说:

当 -z 选项未使用时,在 pathnames 中,TAB、LF 和 backslash 字符分别以 \t、 \n 和 \\ 表示。

所以我认为我的解决方案是必要的,如果有这些字符中的任何一个字符。

答案来自Matt Frear是最有效的IMHO. 下面只是一个PowerShell脚本给那些在Windows只删除文件从他们的Git存储库,符合他们的排除列表。

# Get files matching exclusionsfrom .gitignore
# Excluding comments and empty lines
$ignoreFiles =  gc .gitignore | ?{$_ -notmatch  "#"} |  ?{$_ -match  "\S"} | % {
                    $ignore = "*" + $_ + "*"
                    (gci -r -i $ignore).FullName
                }
$ignoreFiles = $ignoreFiles| ?{$_ -match  "\S"}

# Remove each of these file from Git
$ignoreFiles | % { git rm $_}

git add .