.gitignore 和 git rm --cached 命令无法阻止文件被追踪。

6

我有一个安卓项目,其中包含一个测试模块,该模块将在git目录的子目录中删除和重新创建.apk文件。

我已将这些内容添加到.gitignore(包括目录、明确指定的文件和*.apk),然后我执行了以下操作:

git rm -r --cached src/main/Tests/bin

并且git告诉我:
rm 'src/main/Tests/bin/Tests-debug-unaligned.apk'
rm 'src/main/Tests/bin/Tests-debug.apk'
rm 'src/main/Tests/bin/Tests.ap_'
rm 'src/main/Tests/bin/classes.dex'

i then

git commit . -m "removed apk files"

我重新运行了删除文件并重新创建它们的测试。运行git status,它们显示为已修改。看来.gitignore没有起作用。这是我的.gitignore文件。

*ipr
*iml
*iws
.gitignore
out/
*apk
src/main/Tests/bin
src/main/Tests/bin/*
src/main/Tests/bin/Tests-debug-unaligned.apk

这是因为你在将它们移除后没有将它们添加到.gitignore文件中吗? - Victor S
3个回答

29

我认为你需要使用以下命令清除所有已暂存的文件:

git rm -r --cached .

git add -A

然后提交:

git commit -m ".gitignore"

但在此之前确保你提交了你的更改。


1

我刚刚尝试了你的配方,对我很有效。

~ % mkdir deleteme
~ % cd deleteme
~/deleteme % mkdir src src/main src/main/Tests src/main/Tests/bin
~/deleteme % touch src/main/Tests/bin/blah.apk                   
~/deleteme % git init
Initialized empty Git repository in /Users/sri/deleteme/.git/
~/deleteme (master*) % touch src/main/hello.txt
~/deleteme (master*) % git add .
~/deleteme (master*) % git commit -m "init"
[master (root-commit) 0ef5764] init
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 src/main/Tests/bin/blah.apk
 create mode 100644 src/main/hello.txt
~/deleteme (master) % vi .gitignore
~/deleteme (master) % git rm -r --cached src/main/Tests/bin
rm 'src/main/Tests/bin/blah.apk'
~/deleteme (master*) % git commit -m "removed"
[master 5ca6456] removed
 0 files changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 src/main/Tests/bin/blah.apk
~/deleteme (master) % touch src/main/Tests/bin/blah.apk    
~/deleteme (master) % git status
# On branch master
nothing to commit (working directory clean)
~/deleteme (master) %  

可能是在其他目录中的gitconfig文件(或全局指令)覆盖了您所声明的gitconfig文件。您没有提到这个gitconfig文件的位置。请参阅gitignore的man页面或在线帮助文档,了解可以指定忽略规则的各个位置的优先级。man页面上说...

...the following order of precedence, from highest to lowest (within one level of precedence, the last matching pattern decides the outcome): Patterns read from the command line for those commands that support them.

   o   Patterns read from a .gitignore file in the same directory as the path, or in any
       parent directory, with patterns in the higher level files (up to the toplevel of the
       work tree) being overridden by those in lower level files down to the directory
       containing the file. These patterns match relative to the location of the .gitignore
       file. A project normally includes such .gitignore files in its repository, containing
       patterns for files generated as part of the project build.

   o   Patterns read from $GIT_DIR/info/exclude.

   o   Patterns read from the file specified by the configuration variable core.excludesfile

0

你试过只是这样吗?

*.apk

在你的.gitignore文件中添加了吗?如果它们之前被跟踪过,你需要在设置.gitignore之前删除它们并提交更改。一旦它们被排除在外,就可以在.gitignore文件中添加条目,然后它应该就能正常工作了。


我提交了文件的删除。我知道它“应该起作用”,但实际上并没有。 - browep
apk以及它们所在的目录,再加上一个绝对路径,以确保结果相同。 - browep
2
清理.gitignore文件,以不包含任何.apk条目。提交更改。删除apk文件。git add -A并提交更改。只需将*.apk添加到忽略文件中。提交更改。现在应该正确地忽略这些文件了。您可以通过执行git reset --soft head~3 && git add -A && git commit -m "fixed ignore"将所有这些清理工作压缩为一个提交。 - Adam Dymitruk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接