📌  相关文章
📜  忽略 Git 中的文件和文件夹

📅  最后修改于: 2022-05-13 01:58:11.133000             🧑  作者: Mango

忽略 Git 中的文件和文件夹

Git 是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型项目到大型项目的所有项目。 Git 依赖于软件的分布式开发,其中多个开发人员可以访问特定应用程序的源代码,并且可以修改其他开发人员可能看到的更改。因此,在本文中,我们将介绍与忽略 git 中的文件和文件夹相关的各种概念。我们将通过学习如何创建 .gitignore 文件及其工作原理来开始本文。

创建 .gitignore 并了解其功能

创建 .gitignore 文件

使用 git status 显示文件的状态

现在我们可以看到有很多文件在未跟踪的文件中,其中一些是已经暂存的文件,但没有被忽略的文件。听起来很有趣,这意味着 git 中也有被忽略的文件。因此,要忽略 git 中的文件,我们使用 . gitignore文件在该文件中,您可以提及是否要忽略特定文件或以特定扩展名结尾的文件。所以在这个文件中,我们可以看到 *.txt 被提及,这意味着该目录中的所有 .txt 文件都应该被忽略。

在...gitignore中添加不应该添加的文件

现在我们将使用 git status –ignored命令查看目录中所有被忽略的文件。

使用 git status –ignored 查看被忽略文件的状态

.gitignore 文件中的异常

那么 .gitignore 文件中的异常是如何工作的,我们可以以我们在 .gitignore 文件中编写的*.txt为例,这意味着所有 .txt 文件都应该被忽略。此外,我们可以写!file_name.txt这意味着不应忽略特定文件。所以在这里我们可以看到*.txt .gitignore 文件中的所有 .txt 文件在目录中被忽略。

使用 !file_name.txt 编辑 .gitignore 文件

添加后在 .gitignore 文件中添加!file_name.txt我们可以看到该文件现在不在被忽略的文件中,在这里您可以看到 file_name 是以前出现在被忽略文件中的a.txt现在我们可以看到现在该文件位于未跟踪的文件中。

在 .gitignore 文件中添加此 !a.txt 后查看更改

因此,如果某个文件夹中有一些 .txt 文件,那么该文件夹将被忽略,我们无法轻松地重新包含该文件夹中的文件,因此有一个过程如何重新包含该文件夹中的所有这些文件,因为这里根据 .gitignore 所有*. txt文件应该被忽略,除了a.txt。

使用 git status --ignored

在这里你可以看到秘密文件夹在被忽略的文件中,因为根据 .gitignore 所有的 *.txt 文件都应该被忽略。因此,要重新包含 secrets 文件夹中的所有 *.txt 文件,我们必须首先通过在 .gitignore 中写入 !folder_name 来重新包含 secrets 文件夹,此处的 folder_name 是 secrets,然后我们必须通过写入 secrets 来忽略存在于 secrets 文件夹中的所有文件/* 在 .gitignore 中,然后写入 !secrets/*.txt 以重新包含 secrets 文件夹中的所有 .txt 文件,以从忽略的文件中删除该文件夹并重新包含该文件夹中的所有 .txt 文件。

编辑 .gitignore 文件

使用 git status –ignored 查看文件夹是否从忽略的文件中删除

现在,如果我们的用例是删除那些文件名以 !在 .gitignore 文件中再添加一个!或者在你的文件名前面添加 \ 或者你也可以删除一个文件夹,这个文件夹有一些不希望 git 跟踪它们的文件。通过在 a.gitignore 文件中使用这些异常,您将在忽略的文件中移动这些文件和文件夹。

编辑.gitignore

使用 git status –ignored 查看文件是否在被忽略的文件中

一个全局 .gitignore 文件

因此,如果我们的用例是,如果我们希望 git 在所有存储库中忽略特定文件,那么我们可以在任何存储库中创建一个全局 .gitignore 并使用以下命令将其设为全局:

git config --global core.excludesfile path_of_global_gitignore_file

在这里您可以看到路径应该是完整的,即 name_of_the_drive/folder_name/.gitignore 以避免出现类似以下警告的错误:无法访问权限被拒绝致命:无法用作排除文件。现在 git 将在每个存储库的 .gitignore 文件之外使用它。那么让我们看看命令的语法:

显示命令的语法: git config –global core.excludes file path_of_global_gitignore_file

所以现在如果我们编辑全局 .gitignore 文件并写入 *.py 那么它将忽略我们存储库中存在的所有 *.py 文件。现在让我们看看它是如何工作的:

编辑全局 .gitignore 文件

所以现在如果我们使用 git status –ignored 命令,我们将在被忽略的文件中看到所有 .py 文件。

使用 git status --ignored

所以现在如果我们将所有这些 *.py 文件包含在我们存储库的本地 .gitignore 文件中,那么会发生什么,因为我们的全局 .gitignore 文件忽略了所有 .py 文件。现在的问题是谁将优先考虑,所以这个问题的答案是,只要有一个文件被全局 .gitignore 文件忽略但被本地 .gitignore 文件包含,我们的本地 .gitignore 文件总是优先。所以我们会在本地写 !*.py 。 .gitignore 文件将包含所有文件 .py 文件,并且不会将它们放入被忽略的文件中。

编辑本地 .gitignore 文件

所以,现在我们可以看到所有 py 文件现在都在未跟踪的文件中,并且没有 py 文件在被忽略的文件中。

使用 git status –ignored 命令查看 py 文件是否从被忽略的文件中删除

忽略所有已经提交到 Git 存储库的文件

因此,现在如果我们想要一个已经提交到 git 存储库的文件,并且现在我们希望 git 停止跟踪该类型的用例,我们可以使用以下命令将其删除:

git rm --cached file

这将从存储库中删除文件并防止 Git 跟踪任何进一步的更改。 –cached 选项将确保文件没有被物理删除。该文件之前添加的内容仍然可见,但请记住,如果其他人在文件被删除后从存储库中提取,那么他们的副本将被物理删除。

使用之前 git rm --cached 文件的状态

使用 git rm –cached 文件后

您可以让 git 假装文件的工作树版本是最新的,从而使用该命令使用 skip-worktree 选项忽略其中的更改。

git update-index --skip-worktree file_name

这里我们可以看到readme.md被修改了

在这里我们可以看到,在使用上述命令后,git 忽略了 readme.md 中所做的任何更改

在这里我们可以看到,通过使用上述命令,git 无法跟踪 readme.md 中的任何进一步更改,并忽略 readme.md 中所做的任何更改。现在要跟踪 readme.md 中的更改,我们可以使用命令git update-index –no-skip-worktree file_name。

使用命令 git update-index –no-skip-worktree file_name

现在我们可以看到,在使用 git status 时,我们可以看到 readme.md 正在被修改,并且需要暂存一些更改以进行提交。现在,如果您想强制 git 忽略文件中所做的任何更改,那么我们可以使用该命令。

git update-index --assume-unchanged file_name 

使用上述命令使 git 不会忽略该文件

现在,如果我们希望 git 不应该忽略该文件并再次处理它。为此,我们将使用命令

git update-index --no-assume-unchanged file_name 

使用上述命令使 git 不会忽略该文件

在本地忽略文件而不提交忽略规则

如果您想在本地忽略存储库中的某些文件并且不使该文件成为任何存储库的一部分,那么我们将在您的存储库中编辑 .git/info/exclude。在这里,我们将忽略一个名为 rock.py 的文件,现在我们可以看到在编辑文件.git/info/exclude之前,git 正在向我们显示未跟踪文件中的文件。

在编辑文件之前 .git/info/exclude

编辑文件 .git/info/exclude

使用 git status –ignored 查看rock.py的状态

现在我们可以看到 rock.py 现在在被忽略的文件中。

忽略任何目录中的文件

如果我们想忽略任何目录中的文件,我们只需在 . gitignore文件,无论是在您的全局还是本地,或者根据您的用例,它可以是您的存储库的 .git/info/exclude 。如果您希望在您的特定 repo 中只应忽略特定目录中的特定文件,那么您可以在 local.gitignore 文件中提及该文件的名称,如果您希望所有存储库都应该忽略该文件,那么您可以编写全局 .gitignore 中该文件的名称,则该文件将被所有存储库忽略。

提到文件的名称 .gitignore

使用 git status --ignored

在这里,您可以看到该文件现在位于被忽略的文件中,并且包含该文件的任何文件夹也被忽略。现在,如果您只想忽略特定文件夹中的某个文件,那么我们可以像这样编辑 .gitignore : mainfolder_name/**/file_name 。这里 ** 表示子目录。 mainfolder_name/**/file_name的含义这一行只是该文件夹中包含的文件,否则其子目录将被忽略。但是,如果该文件位于存储库的其他同名位置,则不会被忽略。

编辑 .gitignore

使用 git status --ignored

现在我们可以看到在主文件夹中创建的 cars.cpp 文件位于未跟踪的文件中,而位于 testing 文件夹及其子目录中的 cars.cpp 文件被忽略,因为在 .gitignore 文件中写入了testing/ **/cars.cpp这意味着应该在测试文件夹及其子目录中忽略所有具有cars.cpp 名称的文件,或者我们可以做的是在要忽略该文件的文件夹中创建一个本地 .gitignore 文件。现在我们要做的是在我们要忽略该文件的文件夹中创建一个本地 .gitignore 文件。所以我们所做的是我们从本地 .gitignore 文件中删除了这一行 testing/**/cars.cpp ,以便我们可以看到我们新创建的文件夹 testing 中存在的 .gitignore 文件的效果。

编辑本地 .gitignore

使用 git status --ignored 命令

现在您可以看到,在使用 git status –ignored 命令时,我们会看到 testing 文件夹及其子目录中的 cars.cpp 被忽略。

预填充的 .gitignore 模板

创建一个空文件夹

无法在 git 中添加和提交一个空文件夹,因此我们有两种方法来实现这一点:

方法一:.gitkeep

因此,为了在 git 中跟踪一个空文件夹,我们将在存储库中创建一个空文件夹,并在该文件夹中创建一个空的 .gitkeep 文件,该文件会将文件夹注册到 git,我们将能够跟踪该空文件夹。

在没有 .gitkeep 的情况下检查空文件夹 gitisfun 的状态

所以现在我们可以看到 gitisfun文件夹没有任何 .gitkeep 文件,也没有任何 .gitkeep 文件,它没有被 git 跟踪。因此,让我们在一个空文件夹中创建一个 .gitkeep 文件,以便我们可以在 git 中跟踪一个空文件夹。

在空文件夹中创建 .gitkeep 文件

在暂存区添加空文件夹

所以现在我们可以看到空文件夹现在正在被 git 跟踪。还有另一种方法可以用来跟踪 git 中的空文件夹。

方法二:dummy.txt

因此,要使用 dummy.txt 在 git 中跟踪一个空文件夹,我们将创建一个空文件夹,我们将在其中创建一个 dummy.txt 文件,在其中,您可以插入任何您想要的有趣消息,现在在创建这个 dummy.txt 之后在空文件夹中的文件,我们将能够在暂存区添加空文件夹。

没有 dummy.txt 空文件夹不会被 git 跟踪

在空文件夹中创建了 dummy.txt,现在我们可以看到空文件夹正在被 git 跟踪

这里空文件夹的名称是 batman。所以这是我们可以在 git 中跟踪空文件夹的两种方法。

查找被 .gitignore 忽略的文件

因此,现在如果您想查看存储库中 git 忽略的所有文件或存储库中存在的任何目录,我们可以使用以下命令:

git status --ignored

使用 git status --ignored 命令

所以现在如果你想在目录中列出递归忽略的文件,我们将使用一个额外的参数–untracked-files=all 命令是:

git status --ignored --untracked-files=all

使用 git status –ignored –untracked-files=all

所以现在我们可以看到它也列出了目录中所有递归忽略的文件。

忽略跟踪文件中的更改

因此,现在如果您正在考虑忽略跟踪文件中的更改,那么您可能会想为什么不使用 .gitignore 或 .git/info/exclude 并只提及我们想要忽略的文件的名称,但 .gitignore 和 .git/ info/exclude 仅适用于忽略未跟踪的文件。因此,要忽略跟踪的文件,我们使用以下命令git update-index –skip-worktree file_name。因此,在这里您可以看到跟踪文件中的文件try.txt已被修改,但现在在应用命令后: git update-index –skip-worktree file_name git 忽略了try.txt中所做的任何更改,因为我们使用的命令。

修改文件try.txt

使用命令 git update-index –skip-worktree file_name

所以现在我们可以看到,在应用命令git update-index –skip-worktree file_name后,跟踪的文件被忽略了,现在如果你想恢复它,我们可以使用以下命令: git update-index –no-skip-worktree file_name所以这个命令将再次使文件被 git 跟踪。

使用命令 git update-index –no-skip-worktree file_name

我们还可以使用命令git update-index –assume-unchanged file_name来替代git update-index –skip-worktree file_name两者的工作方式相同,并且可以替代我们可以使用的命令git update-index –no-skip-worktree git update-index –no-assume-unchanged file_name命令。