新手问题 git 只忽略本地的文件应该怎么办

76521 · 2014年02月25日 · 最后由 gihnius 回复于 2014年03月10日 · 10006 次阅读

假设我本地有 Gemfile 文件,我本地的 Gemfile 文件跟线上的 Gemfile 文件有区别,git 提交的时候我不想把我本地的 Gemfile 提交到线上,只忽略我自己本地机器的这个文件,比人的不管。 也就是 我们经常有这样一种情况。 有个文件,我们必须入库,大家一起共享,但是呢。每个人本地的配置又是因自己本地的环境而异。这样的话,这个文件就很崩溃了。你要入库,通过.gitignore 和 excludes 都不起作用。每次 git status 都会提示你修改,你又好上传。 git update-index --assume-unchanged FILENAME 执行这个命令了虽然 git status 之后不再提示修改了,但是你切换到别的分支的时候,他又会提示那个文件有问题,让你提交或者 stash。 该怎么解决啊,求高手指点

1 楼 已删除

配置文件入库时,比如 xxx.conf,入库 xxx.conf.example

然后把 xxx.conf 加到.gitignore 中。

#2 楼 @ninehills 那样的话 别人如果 pul 的话也就会把那个文件给删除了吧?

如果线上的 file 不是通用的,也就是说拉到本地之后会根据不同的环境做不同的配置,那么线上的文件就只是一个范例或是模板。因此,它应该和实际运行时的文件区分开来,比如说重命名为 file.example。之后在客户端拉取代码后,自己复制一份重命名,然后用 .gitignore 忽略掉。

如果出现已经 commit 过的文件无法被忽略,那么需要执行:

$ git rm <FILENAME>

之后提交推送,此后 .gitignore 才会对此文件生效。原因是 .gitignore 只会对没有被 git 记录过的文件生效,也就是 untracked file。

文件名放入项目所在的 .git/info/exclude 或者可以参考 2 楼

你的问题解决了吗?

#4 楼 @nightire 你好,能给我个你的 QQ 号,我详细问一下你么

git commit --only -m <commit message> -- <files to commit>

这样可以只 commit 指定的文件,即使还有其他文件已经是 staged 状态了,也是可以的。

我觉得这个是你想要的 git update-index --assume-unchanged

我一般喜欢在配置文件中加上比如

if ENV['LOCATE'] == "home"
  #some config
else
  ...
end

然后本地配置运行的时候麻烦点加个LOCATE=home就行了

建议:最好不要把 Gemfile、Gemfile.lock 从 git 版本库中移除,要不然多人开发的时候会有问题,如果想要配置不一样的,可以把对应的文件加入.gitignore 中,比如数据库文件 config/database.yml, 一般我们会将这个文件加入 .gitignore 中,然后备份一个 config/database.yml.example文件,其他的同理

#11 楼 @huhongda 对,Gemfile(.lock) 不应该忽略。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号