防止git checkout覆盖文件

时间:2010-10-01 12:34:08

标签: linux git

另一个开发人员将他的.rvmrc检查到了git repo。我已经将它删除并添加到gitignore,但每次需要回溯它都会覆盖我的.rvmrc。我在OSX上,所以我发现我可以使用OSX文件锁定机制(Get Info中的“Locked”复选框)来阻止我在开发机器上发生这种情况,但是如何在Linux上完成呢?

我知道它要root并chmod到444,但git(以我的普通用户身份运行),不知何故超越了对所有权的需求。权限并仍然覆盖文件。

1 个答案:

答案 0 :(得分:4)

具有讽刺意味的是,虽然git的默认行为是将未跟踪文件视为宝贵文件,但将文件添加到.gitignore会告诉git它可以随时删除文件。

.gitignore中的条目更常用于表示生成的文件,因此git将以静默方式覆盖它们。 .git/info/exclude中的条目可能应该用于配置文件的本地版本。

请完整阅读this discussion,因为两者之间的差异似乎有些混乱。我刚试了这个,.git/info/exclude中的条目在你回到过去时受到保护,产生“错误:未经跟踪的工作树文件'.rvmrc'将被合并覆盖。”根据Junio C Hamano的说法,两者之间的这种不同行为可能不是故意的。但是,如果您可以从.gitignore中删除该条目并将其移至.git/info/exclude,您可能能够完成此工作,意识到后者未在存储库之间进行版本控制或共享,并且需要手动协作你的同事。

关于权限问题,请参阅:

$ touch foo
$ ls -l foo
-rw-r--r--  1 josh  staff  0 Oct  1 09:55 foo
$ sudo chown root:wheel foo
$ ls -l foo
-rw-r--r--  1 root  wheel  0 Oct  1 09:55 foo
$ unlink foo
$ ls -l foo
ls: foo: No such file or directory

在Unix中,创建或删除文件的能力仅基于包含它的目录的权限。文件本身的权限仅用于修改文件(不幸的是在您的情况下)。 rm实用程序会检查文件的权限,但是unlink是较低级别的,并且盲目地调用系统调用。