使用 Git 忽略文件更改

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Visual Studio 2019 | Visual Studio 2022

Git 不应跟踪项目中的每个文件。 例如,开发环境中的临时文件、测试输出和日志均为可能无需跟踪的文件。

你可以使用各种机制让 Git 了解项目中的哪些文件无需跟踪,并确保 Git 不会报告针对这些文件的更改。 对于 Git 不跟踪的文件,可使用 .gitignore or exclude 文件。 对于 Git 会跟踪的文件,可告知 Git 停止跟踪它们并忽略更改。

在本文中,学习如何:

  • 使用 .gitignore 文件可忽略对未跟踪文件的更改。
  • 使用 exclude 文件可忽略对未跟踪文件的更改。
  • 使用 git update-index 命令可停止跟踪文件并忽略更改。
  • 使用 git rm 命令可停止跟踪文件并忽略更改。

使用 .gitignore 文件

可通过添加和配置 .gitignore 文件来告知 Git 不要跟踪项目中的某些文件。 .gitignore 文件中的条目仅适用于未跟踪的文件。 它们不会阻止 Git 报告对已跟踪文件的更改。 已跟踪文件是已提交并存在于上一个 Git 快照中的文件。

.gitignore 文件中的每一行都指定了相对于 .gitignore 文件路径的文件搜索模式。 .gitignore 语法非常灵活,并支持使用通配符以按名称、扩展名和路径指定单个或多个文件。 Git 将 .gitignore 搜索模式与项目中的文件进行匹配,以确定要忽略的文件。

通常,应将 .gitignore 文件添加到项目的根文件夹中。 但是,你可以将 .gitignore 文件添加到任何项目文件夹,让 Git 知道在任何嵌套深度的该文件夹及其子文件夹中要忽略的文件。 对于多个 .gitignore 文件,.gitignore 文件在文件夹中指定的文件搜索模式优先于 .gitignore 文件在父文件夹中指定的模式。

可手动创建 .gitignore 文件并向其添加文件模式条目。 或者,也可通过从 GitHub gitignore 存储库下载适用于你的开发环境的 .gitignore 模板来节省时间。 使用 .gitignore 文件的好处之一是,你可以提交更改并与他人共享该更改。

注意

创建 Git 存储库时,Visual Studio 会自动为 Visual Studio 开发环境创建 .gitignore 文件。

Visual Studio 2022 通过解决方案资源管理器中的 Git 菜单、Git 更改和快捷菜单来提供 Git 版本控制体验。 Visual Studio 2019 版本 16.8 还提供了团队资源管理器 Git 用户界面。 有关详细信息,请参阅 Visual Studio 2019 - 团队资源管理器选项卡。

Git 更改窗口中,右键单击希望 Git 忽略的任一已更改文件,然后选择忽略此本地项忽略此扩展名。 已跟踪文件中不存在这些菜单选项。

Visual Studio 中的“Git 更改”窗口中已更改文件的上下文菜单选项的屏幕截图。

忽略此本地项选项会向 .gitignore 文件添加一个新条目,并从已更改文件列表中删除所选文件。

忽略此扩展名选项会向 .gitignore 文件添加一个新条目,并从已更改文件列表中删除与所选文件具有相同扩展名的所有文件。

如果存储库的根文件夹中不存在 .gitignore 文件,则任一选项都将创建该文件,并向其中添加条目。

编辑 gitignore 文件

.gitignore 文件中的每个条目要么为:用于指定要忽略哪些文件的文件搜索模式、以数字符号 (#) 开头的注释,要么是空行(为了可读性)。 .gitignore 语法非常灵活,支持使用通配符,以按名称、扩展名和路径指定单个或多个文件。 文件搜索模式的所有路径均相对于 .gitignore 文件。

下面是常见文件搜索模式的一些示例:

# Ignore all files with the specified name.
# Scope is all repo folders.
config.json

# Ignore all files with the specified extension.
# Scope is all repo folders.
*.json

# Add an exception to prevent ignoring a file with the specified name.
# Scope is all repo folders.
!package.json

# Ignore a file with the specified name.
# Scoped to the 'logs' subfolder.
/logs/test.logfile

# Ignore all files with the specified name.
# Scoped to the 'logs' subfolder and all folders beneath it.
/logs/**/test.logfile

# Ignore all files in the 'logs' subfolder.
/logs/

修改 .gitignore 文件后,Git 就会更新其忽略的文件列表。

注意

Windows 用户必须使用斜线 (/) 以作为 .gitignore 文件中的路径分隔符,而不是使用反斜线 (\)。 所有用户在指定文件夹时均须添加尾部斜线。

使用全局 .gitignore 文件

你可以将 .gitignore 文件指定为适用于所有本地 Git 存储库的全局 ignore 文件。 为此,请使用 git config 命令,如下所示:

git config core.excludesfile <gitignore file path>

全局 .gitignore 文件有助于确保 Git 不在任何本地存储库中提交某些文件类型,例如已编译的二进制文件。 特定于存储库的 .gitignore 文件中的文件搜索模式的优先级高于全局 .gitignore 文件中的模式。

使用 exclude 文件

此外,还可将文件搜索模式的条目添加到本地存储库 .git/info/ 文件夹中的 exclude 文件。 exclude 文件可让 Git 了解要忽略哪些未跟踪的文件。 它使用与 .gitignore 文件相同的文件搜索模式语法。

exclude 文件中的条目仅适用于未跟踪的文件。 它们不会阻止 Git 报告已在跟踪的已提交文件的更改。 每个存储库只有一个 exclude 文件。

由于 Git 不会提交或推送 exclude 文件,因此可以安全地使用它来忽略本地系统上的文件,而不会影响其他任何人。

使用 git update-index 忽略更改

有时,暂时停止跟踪本地存储库文件并让 Git 忽略对该文件的更改,这会很方便。 例如,你可能想要为开发环境自定义设置文件,而无需承担提交所做更改的风险。 为此,你可以运行带有 skip-worktree 标志的 git update-index 命令:

git update-index --skip-worktree <file path>

若要继续跟踪,请运行带有 --no-skip-worktree 标志的 git update-index 命令。

你也可以使用带有 assume-unchanged 标志的 git update-index 命令暂时停止跟踪某个文件,并让 Git 忽略对该文件的更改。 此选项不如 skip-worktree 标记有效,因为更改文件内容的 Git pull 操作可还原 assume-unchanged 标记。

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

若要继续跟踪,请运行带有 --no-assume-unchanged 标志的 git update-index 命令。

使用 git rm 忽略更改

.gitignoreexclude 文件中的条目对 Git 已经跟踪的文件不起作用。 Git 会跟踪之前提交的文件。 若要从 Git 快照中永久删除文件以便 Git 不再跟踪它但不将其从文件系统中删除,则请运行以下命令:

git rm --cached <file path>
git commit <some message>

然后,使用 .gitignoreexclude 文件条目来防止 Git 报告对文件的更改。

后续步骤