使用gitignore忽略(但不删除)文件

时间:2011-06-11 16:40:10

标签: git version-control

我的git repo中有一个tmp目录我想仍然存在,但是被忽略了。我将其添加到.gitignore,但git status仍然告诉我该目录中文件的更改。我尝试了git rm -r --cached,但是将其从远程仓库中删除了。如何停止跟踪对此目录的更改,但仍允许它存在?我还需要对1个文件执行此操作,但对git status .gitignore之后的更改也会显示在{{1}}中。我该怎么办?

5 个答案:

答案 0 :(得分:168)

您可以通过运行以下命令来更新本地git存储库,而不是.gitignore

git update-index --assume-unchanged <file>

在这种情况下,正在原始仓库中跟踪文件。您可以在本地仓库中修改它,git永远不会将其标记为已更改。阅读更多内容:

答案 1 :(得分:11)

在允许文件存在的同时忽略对文件所做的更改是.gitignore的确切目的。因此,将文件(或目录)添加到.gitignore是您唯一需要做的事情。

但您的问题是git已经在跟踪您要忽略的文件,而.gitignore不适用于跟踪的文件。停止跟踪的唯一方法是告诉git删除它们。通过使用git rm --cached,可以防止git删除本地文件,但是获取更改的任何其他存储库都将应用删除。我认为没有办法从你自己的存储库中避免这种情况。您必须在其他存储库上执行某些操作,否则接受这些文件将被删除。

为防止在其他存储库中删除,您可以:

  • (显然)在某处备份文件,提取更改并恢复文件,
  • git rm --cached文件并提交之前提取更改。 Git很好地合并了两个删除,而没有触及已经未跟踪的文件。

答案 2 :(得分:7)

/放在.gitignore文件中目录名称的末尾,即

tmp/

如果跟踪了该目录中的文件,则需要先告诉git忘记它们(在将dir添加到忽略列表之前)。假设你没有任何重要的东西(即你可以抓它):

git rm -rf ./tmp/
git commit -m "untrack tmp dir"
mkdir tmp
echo tmp/ >> .gitignore
git add .gitignore ; git commit -m "add tmp/ to ignore list"

不会跟踪该目录中的新文件。

--cached的{​​{1}}选项仅适用于索引(或多或少等待更改)。它对工作树或被跟踪的状态没有影响。

答案 3 :(得分:3)

.gitignore对跟踪的文件没有影响。

您想要的是在tmp /目录中的文件上设置假定未更改的位。这里有一个很好的解释:Git: untrack a file in local repo only and keep it in the remote repo

此外,用于设置的单行假定 - 对目录中的所有文件保持不变 - git update-index --assume-unchanged on directory

答案 4 :(得分:1)

听起来您正在尝试跟踪文件(例如index.php),将其添加到远程存储库,然后停止观看跟踪,同时将文件保留在远程(即保留index.php在本地更改远程仓库时未更改。

根据我的理解,git不能这样做。您可以跟踪文件,也可以不跟踪。如果您跟踪文件,它将存在于远程仓库中,并在您提交更改时进行更改。如果您不跟踪文件,则它在远程仓库中不存在。

由于无法使用git完全按照您的要求进行操作,因此根据您的具体情况,可能还有其他解决方案。例如,为什么在本地更改遥控器时不希望index.php更改遥控器?文件中是否有用户特定的设置?如果是这种情况,您可以这样做:

cp index.php index_template.php
git rm --cached index.php

现在编辑index_template.php,使其显示在远程仓库上。在README中添加一些内容,告诉使用您的存储库的人,一旦克隆它们,他们必须将index_template.php复制到index.php并编辑它以满足他们的需要。

git add index_template.php
git add README
git commit -m 'added template index.php file'
git push

当有人克隆你的回购时,他们必须创建自己的index.php。您已经让它们变得简单了:只需将index_template.php复制到index.php并使用特定于计算机的设置进行修改。