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

我有一个在我的git仓库中的tmp目录,我想仍然存在,但被忽略。 我将它添加到.gitignore ,但是git status仍然告诉我有关该目录中文件的更改。 我试过git rm -r --cached ,但是把它从远程回购中删除。 我怎样才能停止跟踪这个目录的变化,但仍然允许它存在? 我还需要为1个文件执行此操作,但对.gitignore更改后也会显示为git status 。 我该怎么办?

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

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

在这种情况下,一个文件正在原始仓库中被追踪。 你可以在你的本地仓库修改它,git永远不会将它标记为已更改。 阅读更多:

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

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

要防止删除其他版本库,您可以:

  • (显然)在某处备份文件,拉动更改并恢复文件,
  • 或者也git rm --cached文件并提交之前提交您的更改。 Git将很好地合并两个删除而不接触已经未跟踪的文件。

/放在你的.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" 

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

git rm--cached选项只能在索引上运行(或多或less的挂起)。 它对工作树或已跟踪或未跟踪的状态没有影响。

.gitignore对追踪文件没有影响。

你想要的是在tmp /目录中的文件上设置假定不变的位。 有一个很好的解释如何做到这一点: Git:只在本地回购一个文件,并保持在远程回购

另外,在目录中的所有文件上设置假设不变 – git update-index –assume – 目录中没有改变 。

这听起来像你正在试图跟踪一个文件(如index.php ),将其添加到远程存储库,然后停止监视跟踪,同时保持文件在远程(即保持index.php不变的远程仓库,同时改变它在本地)。

从我的理解,git不能做到这一点。 您可以跟踪文件,或不。 如果您跟踪文件,它将存在于远程仓库中,并在您对其进行更改时进行更改。 如果你不跟踪一个文件,它不存在于远程仓库中。

因为不可能用git来完成你想要的function,所以根据你的具体情况,可能还有其他的解决scheme。 例如,当你在本地修改index.php ,为什么不想要index.php ? 文件中是否有用户特定的设置? 如果是这样的话,你可以这样做:

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

现在编辑index_template.php,就像你想让它出现在远程仓库里一样。 添加一些东西到你的自述文件中,告诉使用你的存储库的人,一旦他们克隆它们,他们必须将index_template.php复制到index.php并编辑它以满足他们的需求。

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

当有人克隆你的回购,他们必须创build自己的index.php 。 你已经使它们变得容易了:只需将index_template.php复制到index.php并用计算机特定的设置来修改它。