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


97

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


1
请写下您的.gitignore文件到底是什么样的?
kdehairy 2012年

Answers:


182

.gitignore可以通过运行以下命令来代替本地git存储库:

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

在这种情况下,将在原始存储库中跟踪文件。您可以在本地存储库中对其进行修改,而git绝不会将其标记为已更改。阅读更多信息:


22
我对git的喜爱可能增加了一倍。
Mark Fox

2
这应该是公认的答案。感谢您的链接。
Gowiem13年

4
有没有办法将其推送到远程仓库?
Brian Ortiz 2013年

2
嗯,我宁愿将文件标记为“它不是git文件,即使在其他
仓库中

11
您可以使用恢复它git update-index --no-assume-unchanged <file>。如果要列出它们git ls-files -v | grep '^h'
Sanghyun Lee 2014年

12

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

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

为了防止在彼此的存储库上被删除,您可以:

  • (显然)将文件备份到某个位置,进行更改并还原文件,
  • git rm --cached文件并拉出更改之前提交。Git会很好地合并这两个删除内容,而不会涉及到已经未跟踪的文件。

6
不必一定是这样(“停止跟踪=删除文件”)。您仍然可以使用:在存储库中跟踪文件,而不查看所做的任何更改git update-index --assume-unchanged <file>。看看:blog.pagebakers.nl/2009/01/29/…–
ducin

这解决了我的问题,因为我需要从git中的已推送存储库中删除文件,因此git rm --cached <filename> -r 在此推送再次更改为repositorie之后,将文件删除了
Vinicius Cardoso

7

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

tmp/

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

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选项git rm(或多或少地等待更改)。它对工作树或已跟踪或未跟踪的状态没有影响。


我有这个。无论the/dir/the/dir/*
21312312

嗨,马特,如果我想忽略其他文件夹中的/ Media之类的东西,这可能吗?像/ 1 / Media,/ 2 / Media,一直到99?
Nic


1

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

据我了解,git无法做到这一点。您可以跟踪文件,也可以不跟踪。如果跟踪文件,则该文件将存在于远程存储库中,并且在提交对文件的更改后即会更改。如果您不跟踪文件,则该文件在远程存储库中不存在。

由于无法完全使用git做您想做的事,因此根据您的实际情况,可能还有其他解决方案。例如,为什么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

当某人克隆您的仓库时,他们必须创建自己的仓库index.php。你很容易使之成为他们:简单地复制index_template.phpindex.php与计算机特定的设置进行修改。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.