git 添加添加被忽略的文件

git add adding ignored files

我正在尝试从 git 中删除以前跟踪的目录,这很有效,但它会随着每个后续的 git add .git add -A 等被添加回来。这就是我已完成:

添加到.git项目根目录中忽略:

node_modules

运行 以下:

git rm -r --cached node_modules
git commit -a -m "removed node_modules"
git push origin master

到目前为止一切顺利,这将从远程存储库中删除目录。问题是当我稍后 运行 git status 它告诉我 node_modules 目录未被跟踪并在以后的提交中不断添加它。

我错过了什么and/or我如何找到问题的根源?

来自 here:

The git add command will not add ignored files by default. ... The git add command can be used to add ignored files with the -f (force) option.

来自评论的补充信息:

我正在跟踪。git忽略文件。

git check-ignore node_modules/ returns node_modules/ 符合预期。

没有使用子模块。

更新:

我创建了一个示例,似乎按照上述步骤重现了该问题:

https://github.com/awhitehouse104/SampleRepo

解析:

总结下面的答案和评论,问题出在我的 .gitignore 文件的编码中。我曾使用 echo 'node_modules' > .gitignore 在 windows 8 上创建文件,结果是带有 BOM 的 UTF-16(根据下面的回答)。经过几次 google 搜索,这似乎是 powershell 的默认编码,我可以确认保存为 UTF-8 似乎已经解决了这个问题。

tldr; 可能不会使用这种创建方法。git忽略文件或准备更改编码

echo 'node_modules' > .gitignore

这是我在跟踪后忽略 node_modules 文件夹的操作。

  1. 创建.gitignore文件并添加node_modules

  2. 提交 .gitignore 文件。在此之后,无论您在 node_modules 文件夹中更新什么,都不会出现在 git status.

  3. 但这不会删除我们在 node_modules 文件夹下的回购协议中已有的内容。所以现在我们需要删除我们之前提交的任何内容。

    为此,使用 git rm --cached node_modules -r

  4. 现在git status会显示文件已删除

  5. 对任何消息使用 git commit -m "node_modules removed" 命令。

现在应该从存储库中删除所有内容,并且不会跟踪未来的更改。

另一种方法,如果你不想使用 git rm --cached

rm -Rf node_modules
git add -u
git commit -m "stop tracking node_modules"

npm install
# done

还要注意 node_modules 和 node_modules/ 之间的区别,您似乎是正确的。 (感谢 umläute 对此的说明)

原点必须是光秃秃的。这里有一点 bash 来演示它。如果它不代表您的用例,请随意编辑它。

#!/bin/bash

rm -rf /tmp/git_test
mkdir /tmp/git_test/
git init --bare /tmp/git_test/primary_repo

# populate repo
cd /tmp/git_test/
git clone ./primary_repo ./secondary_repo
cd secondary_repo
echo hi_bob > some_content
mkdir node_modules
echo hi_dave > node_modules/moduleA
git add .
git commit -m "populated primary"
git push

# do the removal in tertiary 
cd /tmp/git_test/
git clone ./primary_repo ./tertiary_repo
cd tertiary_repo
echo node_modules >> .gitignore
git add .gitignore
git rm -r --cached node_modules
git commit -a -m "removed node_modules"
git push origin master
rm -r node_modules
echo --------------------------------
echo git status:
git status

gitignore - 指定要忽略的有意未跟踪的文件。

$HOME/.config/git/ignore, $GIT_DIR/info/exclude, .git忽略

git忽略文件中的每一行指定一个模式。在决定是否忽略路径时,Git 通常会检查 gitignore patterns from multiple sources,优先顺序如下,从高到低(在一个优先级内,最后匹配的模式决定结果):

要忽略整个目录,您应该使用 /**

尾随 /** 匹配里面的所有内容。例如,abc/** 匹配目录 "abc" 内的所有文件,相对于 .gitignore 文件的位置,具有无限深度。

您可以通过将此行添加到根目录来忽略整个目录。git忽略文件:

/Dir_Name

相反,您可以添加 /logs/。git忽略包含以下内容的文件:

[^.]*

该目录将保留在您的存储库中,但 /directory 中的所有文件都将被忽略。简单!

您需要遵循的步骤是,

  1. 将其从项目目录中移除(不实际删除):

    git rm --缓存文件夹/*

  2. 如果您还没有 .gitignore,您可以在您的项目文件夹中创建一个:
  3. 项目/.git忽略。将文件夹/*(或您认为上面列表中更好的任何模式)放入 .gitignore Commit:
  4. git 提交 -m "message"。
  5. 将您的更改推送到 github。

排除除特定目录 foo/bar 之外的所有内容的示例(注意 /* - 没有斜杠,通配符也会排除 foo/bar 中的所有内容):

$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar

添加文件git忽略,然后

git update-index --assume-unchanged <file>

你可以做到

git check-ignore -v --no-index path/with/unexpected/result

了解为什么 git add 添加或不添加该路径。

git check-ignore docs.

特别是要检查实际添加的内容,而不是目录。

进一步,做find . -name .git。子模块是嵌套的 repos,.gitmodules 子模块命令很方便,但它们只是在那里提供帮助。

您的 .gitignore 文件中 node_modules 行之后的某处可能有一个否定规则(include-again 规则,以 ! 开头的规则)。

git check-ignore 在文档中有一个 bug/ambiguity。您期望如果 git check-ignore node_modules/ 打印 node_modules/,则忽略 node_modules/。但实际上,如果该路径名匹配任何忽略模式(正或负),它会打印一个路径名。唯一可以确定的方法是使用 -v (--verbose) 选项,这将使 git check-ignore 打印匹配的模式。
此外,如果 git check-ignore -v 表示一个目录被忽略,并不一定意味着该目录中的所有文件都被忽略。示例回购:

/
    .git/
    .gitignore
    node_modules/
        bar
        foo
$ cat .gitignore 
/node_modules/*
!/node_modules/foo

$ git check-ignore -v node_modules/
.gitignore:1:/node_modules/*    node_modules/
             ^ positive pattern => ignored

$ git check-ignore -v node_modules/foo
.gitignore:2:!/node_modules/foo node_modules/foo
             ^ negative pattern => not ignored

$ git add -A

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   node_modules/foo
#

因此,如果 git check-ignore -v node_modules/node_modules/ 被忽略,请对已添加的单个文件执行 git add -A node_modules/ 然后 运行 git check-ignore -v --no-index,以发现它们的原因已添加。


更新:没想到:你的.gitignore文件是"UTF-16 with BOM (byte order mark)"编码的:

$ cat .gitignore | hexdump -vC
00000000  ff fe 6e 00 6f 00 64 00  65 00 5f 00 6d 00 6f 00  |..n.o.d.e._.m.o.|
00000010  64 00 75 00 6c 00 65 00  73 00 0d 00 0a 00        |d.u.l.e.s.....|

这就是为什么 git 可能无法处理它。以不带 BOM 的 UTF-8 格式保存文件,这应该可以解决问题。但我还建议针对 git check-ignore 提交错误报告 - 在这种极端情况下,其输出显然与 git 实际忽略的内容不一致。

我创建了一个存储库来尝试复制你的问题,我从 http://www.whosebug.com/questions/11451535/gitignore-not-working 得到了第一个答案。

如果你好奇的话,这是我的回购协议:https://github.com/IAMZERG/so_project_gitignore

尝试将此添加到 .git忽略:

**/directory_to_remove

之后,运行 git rm --cached directory_to_remove -r

git 状态应该显示您在要删除的目录中删除了一堆文件。 然后,提交并推送到您的遥控器,一切都应该是金色的……也许吧?

我有一个类似的问题。确保我的编码是 ANSI 并且行尾是 Unix(LF) 解决了我的问题。

我找到了一种将文件添加到 .gitignore 的方法,即使它们已经被提交过一次。这有点残酷,但效果很好。

  1. 将不同的文件添加到您的 .gitignore

  2. 将这些文件从您的 git 项目中移出

  3. Rescan & StageChanged,这些操作会告诉你这些文件已经被删除了

  4. 提交

  5. 将您的文件移回您的项目,它们将不再被跟踪!