2011-06-11 148 views
77

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

+0

请写下究竟是什么你的.gitignore文件看起来像? – kdehairy 2012-07-25 06:25:20

回答

7

将一个/在目录名的末尾在.gitignore文件,即

tmp/ 

如果已跟踪该目录内的文件,你需要告诉混帐约他们先忘了(你加之前目录到忽略列表)。假设你没有什么重要的东西(即你可以划伤它):

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只适用于索引(等待更改或多或少)。它对工作树或已跟踪或未跟踪的状态没有影响。

+0

我有。 '/ dir /'和'/ dir/*' – 21312312 2011-06-11 16:47:57

+0

@ 21312312:更新了我的答案。 – Mat 2011-06-11 16:57:27

+0

嘿,垫子,如果我喜欢/媒体在不同的文件夹,我想忽略,这可能吗?所以像/ 1 /媒体,/ 2 /媒体,一直到99? – Nic 2011-06-11 17:22:36

9

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

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

要防止对方库中,您可以去除:

  • (显然)备份文件的地方,拉更改并恢复文件,
  • 或也git rm --cached文件和之前提交拉动你的改变。 Git将很好地合并两个删除而不触及已经未记录的文件。
+5

这并非必须如此(“停止跟踪=移除文件”)。您仍然可以在回购站中跟踪文件,而不会看到任何更改,使用:'git update-index --assume-unchanged '。看看:http://blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/ – ducin 2013-05-08 13:30:17

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.php复制到index.php并使用计算机特定的设置对其进行修改即可。

139

相反的.gitignore,您可以通过运行以下命令来更新本地的Git仓库:

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

在这种情况下,文件处于原点回购进行跟踪。你可以在你的本地仓库修改它,git永远不会将它标记为已更改。更多详情:

+19

我对git的热爱可能会增加一倍。 – 2013-06-17 17:55:17

+2

这应该是被接受的答案。感谢您的链接。 – Gowiem 2013-07-17 17:56:37

+3

有没有办法将其推送到远程回购? – 2013-09-03 05:31:21