git添加添加被忽略的文件

我试图从git中删除以前跟踪的目录,该目录可以正常工作,但是随后每次git add .git add -A等。这是我所做的:

在项目的根目录中添加到.gitignore:

 node_modules 

运行以下命令:

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

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

我错过了什么和/或如何find我的问题的根源?

从这里 :

git add命令默认不会添加被忽略的文件。 … git add命令可用于添加-f(强制)选项忽略的文件。

来自评论的其他信息:

我正在跟踪.gitignore文件。

git check-ignore node_modules/ node_modules /如预期的那样返回node_modules /。

没有使用子模块。

更新:

我已经创build了一个示例,按照上面的步骤复制问题:

https://github.com/awhitehouse104/SampleRepo

parsing度:

总结下面的答案和评论,问题是在我的.gitignore文件的编码。 我已经使用echo 'node_modules' > .gitignore在Windows 8上创build文件,它出现为带有BOM的UTF-16(根据下面的答案)。 经过几次谷歌search,似乎这是PowerShell的默认编码,我可以确认保存为UTF-8似乎已经解决了这个问题。

tldr; 可能不使用这种方法创build.gitignore文件或准备更改编码

echo 'node_modules' > .gitignore

您可能在node_modules行后面的.gitignore文件中包含一个否定规则(include-again rule,以!开头的规则)。

git check-ignore在文档中有一个错误/不明确的地方。 你期望如果git check-ignore node_modules/打印node_modules/ ,那么node_modules/被忽略。 但实际上,如果该path名与任何忽略模式匹配,则会打印一个path名 – 正值或负值。 唯一可以肯定的方法是使用-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文件是在“带有BOM(字节顺序标记)”编码的UTF-16中:

 $ cat .gitignore | hexdump -vC 00000000 ff fe 6e 00 6f 00 64 00 65 00 5f 00 6d 00 6f 00 |..node_.mo| 00000010 64 00 75 00 6c 00 65 00 73 00 0d 00 0a 00 |dules....| 

这就是为什么git可能无法处理它。 以不含BOM的UTF-8保存文件,解决问题。 但是我也build议提交一个对git check-ignore的错误报告 – 在这种情况下,它的输出显然与git实际忽略的不一致。

你可以做

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

看看为什么git add或不添加该path。

git check-ignore docs 。

尤其重要的是你想检查实际添加的内容,而不是目录。

进一步, find . -name .git find . -name .git 。 子模块是嵌套的回购, .gitmodules和submodule命令是方便的,但他们只是在那里帮助他们。

然后将文件添加到git忽略

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

这是我跟踪它后忽略node_modules文件夹。

  1. 创build.gitignore文件并向其添加node_modules

  2. 提交.gitignore文件。 在此之后,无论您在node_modules文件夹中更新哪个,都不会以git status显示。

  3. 但是这并不会删除我们已经在node_modules文件夹下的repo中拥有的东西 。 所以现在我们需要删除我们之前所做的任何事情。

    为此,请使用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对此的注意)

我创build了一个存储库来尝试和复制您的问题,并从http://www.stackoverflow.com/questions/11451535/gitignore-not-working得到第一个答案的工作。;

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

尝试添加到.gitignore,而不是:

** / directory_to_remove

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

git状态应该会显示你删除了你正试图删除的目录中的一堆文件。 然后,提交并推送到您的远程,一切都应该是金…也许?

我有一个相似的问题。 确保我的编码是ANSI,行结束是Unix(LF)解决了我的问题。

gitignore – 指定有意未被追踪的文件被忽略。

$ HOME / .config / git / ignore,$ GIT_DIR / info / exclude,.gitignore

gitignore文件中的每行指定一个模式。 当决定是否忽略一个path时,Git通常会检查来自多个源的gitignore模式,按照以下优先顺序从高到低(在一个优先级内,最后一个匹配模式决定结果):

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

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

要么

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

/ DIR_NAME

相反,您可以添加一个包含以下内容的/logs/.gitignore文件:

[^。] *

该目录将保留在您的回购站中,但是/目录内的所有文件都将被忽略。 简单!

你需要遵循的步骤是,

  1. 从项目目录中删除它(不实际删除它):

    git rm – caching文件夹/ *

  2. 如果你还没有一个.gitignore,你可以在你的项目文件夹内做一个。
  3. 项目/的.gitignore。 将.gitignore文件夹/ *(或者您认为上面列出的任何模式更好)提交:
  4. git commit -m“消息”。
  5. 把你的改变推到github上。

示例排除除特定目录foo / bar以外的所有内容(请注意/ * – 不带斜杠,通配符也会排除foo / bar内的所有内容):

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

起源必须是裸露的。 这是一个小小的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