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 文件夹的操作。
创建.gitignore文件并添加node_modules。
提交 .gitignore 文件。在此之后,无论您在 node_modules 文件夹中更新什么,都不会出现在 git status
.
中
但这不会删除我们在 node_modules 文件夹下的回购协议中已有的内容。所以现在我们需要删除我们之前提交的任何内容。
为此,使用 git rm --cached node_modules -r
现在git status
会显示文件已删除
对任何消息使用 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 中的所有文件都将被忽略。简单!
您需要遵循的步骤是,
将其从项目目录中移除(不实际删除):
git rm --缓存文件夹/*
- 如果您还没有 .gitignore,您可以在您的项目文件夹中创建一个:
- 项目/.git忽略。将文件夹/*(或您认为上面列表中更好的任何模式)放入 .gitignore Commit:
- git 提交 -m "message"。
- 将您的更改推送到 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
添加或不添加该路径。
特别是要检查实际添加的内容,而不是目录。
进一步,做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 的方法,即使它们已经被提交过一次。这有点残酷,但效果很好。
将不同的文件添加到您的 .gitignore
将这些文件从您的 git 项目中移出
Rescan & StageChanged,这些操作会告诉你这些文件已经被删除了
提交
将您的文件移回您的项目,它们将不再被跟踪!
我正在尝试从 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 文件夹的操作。
创建.gitignore文件并添加node_modules。
提交 .gitignore 文件。在此之后,无论您在 node_modules 文件夹中更新什么,都不会出现在
中git status
.但这不会删除我们在 node_modules 文件夹下的回购协议中已有的内容。所以现在我们需要删除我们之前提交的任何内容。
为此,使用
git rm --cached node_modules -r
现在
git status
会显示文件已删除对任何消息使用
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 中的所有文件都将被忽略。简单!
您需要遵循的步骤是,
将其从项目目录中移除(不实际删除):
git rm --缓存文件夹/*
- 如果您还没有 .gitignore,您可以在您的项目文件夹中创建一个:
- 项目/.git忽略。将文件夹/*(或您认为上面列表中更好的任何模式)放入 .gitignore Commit:
- git 提交 -m "message"。
- 将您的更改推送到 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
添加或不添加该路径。
特别是要检查实际添加的内容,而不是目录。
进一步,做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 的方法,即使它们已经被提交过一次。这有点残酷,但效果很好。
将不同的文件添加到您的 .gitignore
将这些文件从您的 git 项目中移出
Rescan & StageChanged,这些操作会告诉你这些文件已经被删除了
提交
将您的文件移回您的项目,它们将不再被跟踪!