我仍在学习 git 并掌握它的窍门。我只想忽略工作流程本地的文件。我在这里阅读了许多问答以及 git 文档,但没有一个真正提到或解释如何创建和访问
.git/info/exclude
文件以对其进行修改。当我调用 ls -la
命令查看本地存储库中的所有隐藏文件时,我没有该文件,或者至少它不在 git 的根目录中。我只看到 .git
、.gitignore
以及存储库中看到的其他文件。
每次我编辑文件并暂存它时,还有其他系统文件不断显示为已修改。我最终必须每次都将其隐藏起来才能提交/推送到远程存储库。
我尝试过使用
nano .git/info/exclude
、cat .git/info/exclude
等命令,假设我必须创建一个命令才能使其工作,但它显示 Error: No such file or directory
。那么,我如何访问该文件以开始在本地忽略它们,以使我的工作流程更轻松、更轻松?
另外,我运行了命令
cd .git
,我在 .git
目录中看到了一些文件(但没有 info/exclude
文件夹):
注意:我知道
git update-index --assume-unchanged <file>
和git update-index --skip-worktree <file>
是本地忽略文件的其他方法,但我有兴趣知道如何用.git/info/exclude
方式做到这一点。
有几件事:
首先,您很可能想使用
.gitignore
而不是 .git/info/exclude
。 它做同样的事情,除了它被签入存储库并与所有工作文件一起进行版本控制。 在大多数情况下,这将是所需的行为。
(如果您使用
.git/info/exclude
那么只有存储库的特定克隆会忽略指定的路径,并且如果忽略规则随着代码的发展而变化,那么您将无法跟踪哪些规则与哪些规则相匹配您的代码版本。)
但是如果你真的想使用
.git/info/exclude
...那么,你将它视为单个文件名,但是(根据 *NIX 约定,在大多数 git 文档中普遍存在)/
是一个路径分隔器。 所以在你的仓库中你会看到.git
。 然后
cd .git
如果您在那里执行
ls
,您可能会看到info
。 如果没有的话
mkdir info
然后您可以
cd info
并创建文件exclude
另一种选择是将
.gitignore
添加到 .gitignore
,然后它将忽略自身,仅在本地工作,就像 .git/info/exclude
应该工作的那样。
然后,您仍然可以在不会被忽略的子文件夹中创建 .gitignore
文件(除非您在顶层 */.gitignore
中包含 .gitignore
)。
如果我错了,请在评论中纠正我,但这是因为每当讨论
.gitignore
与 .git/info/exclude
时,似乎到处都忽略了一些细节:
.gitignore
和 .git/info/exclude
只是每行一个文本模式的列表。.gitignore
就像任何其他文件一样,为了使其“同步”并应用于存储库的任何克隆,必须将其添加到存储库,像任何其他文件一样提交和推送,这就是 OP 保留的原因需要承诺。.git/info/exclude
永远只能是本地的,因为.git/
中的文件永远无法在存储库中跟踪。总之,
.gitignore
的同步行为是选择加入。
对于那些多年后偶然发现这个问题的人,这里有一个总结。
忽略本地文件夹
如上所述使用
.gitignore
和 .git/info/exclude
:
f*oo
等通配符来排除以 f
开头并以 oo
结尾的任何内容。foo
就足够了,不需要foo/*
。.gitignore
文件,那么如果您想添加,例如, bar
到 foo/.gitignore
或 foo/bar
到 .gitignore
,那么这就成为最佳实践和用例的问题,它们会有同样的效果。foo/.git
,然后您可以将一个 git 存储库的内容包含到另一个 git 存储库中,并且排除所包含存储库的 .git
文件夹将避免冲突。您仍然需要单独同步。忽略远程文件夹
OP 明确提到了
--assume-unchanged
和 --skip-worktree
。
手册页现在明确提到使用 git sparse-checkout
来排除远程文件的同步/下载(例如排除在 Dropbox 中下载同步的文件夹);这使用了 --assume-unchanged
和 --skip-worktree
,它们是低级命令,正确地在后台运行。