Git忽略特定文件

30

我已经玩了一段时间,非常喜欢它。 让我来描述我的情况。

我有两台电脑,其中有我的存储库和一个远程存储库。

在我的文件中,我有一个配置文件,在这两台计算机上是不同的。 因此,当我在我的计算机上进行拉取操作时,我不需要拉取该配置文件,但需要拉取其他所有文件。 我该如何做到这一点?

我已阅读有关.gitignore文件的内容,但我无法弄清楚它们是如何工作的,或者它们是否适用于我的情况。

6个回答

50

.gitignore文件用于那些你还没有check in的文件/文件夹。它实质上是一个文本文件,你可以在仓库中创建,并列出相对于放置它的目录的路径,Git会忽略这些路径。你可以将 .gitignore 文件作为仓库的一部分 check-in。你可以在这个页面的末尾找到示例。

如果你的文件已经在仓库中被check in,那么可以使用:

git update-index --assume-unchanged file

这会告诉Git忽略该文件在未来所做的任何更改。但是这是一个本地配置,因此您需要在每台计算机上进行设置。您可以通过执行以下操作来撤消它:

git update-index --no-assume-unchanged file

根据配置文件的内容,将一个骨架/示例配置文件放在代码库里是一个好的做法。这类似于PHP中config_example.php的做法,人们可以使用它来创建config.php, 而config.php则不会被提交到代码库中,因为它被添加到了忽略列表中。


1
git update-index --assume-unchanged 对我有用(git 后面没有连字符)。使用的是 git 版本 1.8.1.2 - OS X 10.8.2。谢谢! - guapolo
1
在过去,大多数git命令的形式是git-COMMAND而不是git COMMAND,这就是答案中有连字符的原因。 - Ivan Zlatev
但如果文件已经被追踪怎么办?我使用了你的git命令,并加上了--assume-unchanged选项,然后尝试拉取主分支,但仍然出现错误信息:error: Your local changes to 'conf.py' would be overwritten by merge. Aborting. - fanchyna
@fanchyna 嗯 - 没错。甚至在 http://git-scm.com/docs/git-update-index 的文档中都有说明 这个选项也可以作为一种粗略的文件级别机制来忽略已跟踪文件中未提交的更改(类似于 .gitignore 对未跟踪文件所做的操作)。如果 Git 需要修改索引中的此文件,例如在合并提交时,则会失败(优雅地);因此,如果假定未跟踪的文件在上游发生了更改,则需要手动处理该情况。 - Ivan Zlatev
在我尝试通过执行git pull --rebase origin master更新本地副本的情况下,这会起作用吗?我已经尝试过了,但没有成功。我希望它在从远程获取时忽略一个文件。 - Sindhu S
这对我很有用。但是我想补充一点,以这种方式标记的文件将显示在带有h标题行的git ls-files中。因此,您可以像这里所述那样使用git ls-files | grep '^h'列出它们:https://dev59.com/H2Qm5IYBdhLWcg3w-i9L#17195901。 - vmonteco

8

如果你想在代码库中忽略config.local文件,只需创建一个.gitignore文件,并在其中添加/config.local一行,然后将其加入并提交到代码库即可。


3
也许举个例子会更好理解。这是我项目文件中 .gitignore 文件的一部分内容:
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
*.pro.user.*
tmp/
release/
debug/
bin/
moc_*
ui_*
*.bck
*_debug

#Visual Studio stuff
lib/*.lib
*.ncb
*.suo

这只是文件的一部分。您需要根据项目进行调整。

关键是格式是灵活的,您不应该在共享文件时遇到问题。如果有问题,请将其从存储库中排除。


我需要将它放在根目录吗? - Headshota
我通常将一个放在根目录下。然后,为了那些我不想放入“主. gitignore”文件中的特殊情况,在文件夹中创建专门的git忽略文件。 - Derick Schoonbee
我已经添加了忽略文件,但当我改变配置文件时,状态仍然显示该文件被修改。这是正常的吗? - Headshota
它已经被添加了吗?git status 状态显示的是什么 - 只是修改过的吗? - Derick Schoonbee
哦,终于好了,我把它从仓库中移除了,现在被忽略了。谢谢。 - Headshota

2
.gitignore 文件可能是您需要的。在该文件中,您可以按每行一个的方式列出文件模式,这将导致 git status 不会报告这些文件。
但是,如果您已经提交了这些文件,则在执行 git pull 时它们仍然会被拉取。
您也可以将 .gitignore 文件提交到存储库中。这样,所有计算机上都将忽略相同的文件。

6
关于提交 .gitignore 的注意事项:如果您不打算提交它,最好使用.git/info/exclude - Michael Krelin - hacker
谢谢你的赞美之言! - Victor Zamanian

0
请注意,还有一点需要说明。
git update-index --assume-unchanged file

如果你尝试切换分支,这并不会有所帮助。

$ git checkout master
error: Your local changes to the following files would be overwritten by checkout:
    file
Please commit your changes or stash them before you switch branches.
Aborting

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接