目录
1. 问题
在使用Git等版本管理工具时,通常有两种情况,您希望版本管理工具GIT忽略对工作目录或文件本身的更改:
- 垃圾邮件文件
- 本地版本文件
在案例1)中,通常具有生成过程的输出、中间文件或生成的最终结果。这些是你想要UNTRACKED的文件,也就是说Git根本不应该跟踪这些文件。所以,你希望它们不被跟踪。
在案例2)中,通常您的文件的本地版本与跟踪版本不同,但您不希望将本地更改提交到Git。例如,如果使用包含数据库连接字符串的配置文件(如web.config)。您希望该文件被跟踪,因为它是应用程序的重要组成部分,但您希望忽略对本地系统的更改,因为本地版本将包含您的本地设置,这些设置对于项目中的每个开发人员都是不同的。因此,您希望它们被跟踪,忽略本地更改。
2. 有4种方法可以忽略Git中的文件
以下是在Git中忽略文件的四种方法:
- .gitignore(GLOBALY UNTRACKED)的用法
- .git/info/exclude 的用法(LOCALY UNTRACKED)
- assume-unchanged的用法(TRACKED,LOCAL CHANGES IGNORED)
- skip-worktree的用法(TRACKED,LOCAL CHANGES IGNORED)
3. 示例项目
我们设置了一个小项目来演示这篇文章:
我们使用Gui工具SourceTree添加和提交文件:
4. 方法A——.gitignore的使用
4.1. 概述
.gitignore文件的用法非常流行,并且在其他地方有很好的描述,所以我不会详细介绍。值得一提的是,此方法计划应用于您希望GLOBALY UNTRACK的文件。在使用该存储库的所有系统上,Git会完全忽略.gitignore中的文件。
您需要添加.gitignore文件,并将要忽略的文件添加到该文件中。您需要将.gitignore添加并提交到Git。
此方法可以应用于未跟踪的文件,并且您希望忽略它们。不宜在Git已跟踪的文件上尝试此方法。将Git跟踪的文件添加到.gitignore不会提供任何结果。有人可能会认为,如果我将跟踪的文件添加到.gitignore,从那时起它就不会被跟踪,但它不是那样工作的。
4.2. 示例
让我们假设我们有一个我们不想跟踪的spam1.txt文件。SourceTree将报告它在那里:
您需要添加.gitignore文件,并将要忽略的文件添加到该文件中。您需要将.gitignore添加并提交到Git。以下是现在的情况:
因此,SourceTree不再看到spam1.txt。它确实会看到一个附加文件.gitignore。所以文件spam1.txt是GLOBALY未跟踪的。
5. 方法B——.git/info/exclude的使用
5.1. 概述
您需要添加.git/info/exclude文件,并将您要忽略的文件添加到该文件中。格式与.gitignore文件的格式相同。
此方法与.gitignore方法非常相似,只是文件.git/info/exclude 本身不是存储库的一部分,因此它的影响是本地的。此方法计划应用于要LOCALLY UNTRACK的文件。
5.2 示例
让我们假设我们有一个我们不想跟踪的spam2.txt文件。SourceTree将报告它在那里:
您需要添加.git/info/exclude文件,并将您要忽略的文件添加到该文件中。格式与.gitignore文件的格式相同。以下是现在的情况:
SourceTree不再看到spam2.txt文件。所以文件spam2.txt是LOCALY UNTRACK。
6. 方法C——assume-unchanged的使用
6.1. 概述
该assume-unchanged选项被设想为一种性能辅助工具,但经常在忽略文件的变通方法的上下文中提及。你明确告诉Git不要检查文件是否已更改。此方法计划应用于要忽略跟踪、本地更改的文件。
以下是此方法所需的命令:
To ignore local changes to tracked files:
git update-index --assume-unchanged [<file>...]
To track local changes again:
git update-index --no-assume-unchanged [<file>...]
To list all files assumed unchanged:
git ls-files -v | grep '^[[:lower:]]'
值得一提的是,互联网上的一些文章[3]强烈反对使用这种方法。
6.2 示例
让我们添加config1.txt文件并将其提交到存储库。
然后对文件 config1.txt 进行一些更改,并且SourceTree报告文件已被编辑:
在命令提示符下,您需要添加一个命令以假定文件未更改。源代码树将不再报告文件已被编辑。
SourceTree不再将config1.txt文件视为已修改,尽管该文件实际上已被本地修改,因此,文件config1.txt被跟踪,本地更改被忽略。
7. 方法D——skip-worktree的使用
7.1. 概述
互联网上的许多人推荐该skip-worktree选项作为忽略文件的正确方法。你明确告诉Git不要检查文件是否已更改。此方法计划应用于要忽略跟踪、本地更改的文件。
以下是此方法所需的命令:
To ignore local changes to tracked files:
git update-index --skip-worktree [<file>...]
To track local changes again:
git update-index --no-skip-worktree [<file>...]
To list all files marked with skip-worktree:
git ls-files -v | grep ^S
7.2. 示例
让我们添加config2.txt文件并将其提交到存储库。
然后对文件config3.txt进行一些更改,并且SourceTree报告该文件已被编辑:
在命令提示符下,您需要添加命令skip-worktree。源代码树将不再报告文件已被编辑。
SourceTree不再看到config2.txt文件已修改,尽管该文件实际上已被本地修改,因此,文件config2.txt被跟踪,本地更改被忽略。
8. 结论
有TRACKED文件的用例,LOCAL CHANGES IGNORED非常强大。仅提及每个开发人员ASP.NET都将使用至少一个数据库连接字符串在本地修改的web.config文件。在这种情况下使用.gitignore并不能解决问题。合适的方法是在Git中使用skip-worktree选项。
Git有很多选项,但命令行界面对用户不友好。令人非常失望的是,即使是 GUI SourceTree也没有提供上下文菜单选项来设置文件“本地更改未跟踪”标志。
9. 参考资料
- [1] How do I configure git to ignore some files locally? - Stack Overflow
- [2] git ready » temporarily ignoring files
- [3] gitignore - git ignore vs. exclude vs. assume-unchanged - Stack Overflow
- [4] Keep local modifications in Git-tracked files - avdi.codes
https://www.codeproject.com/Articles/5363864/Git-4-Ways-to-Ignore-Files