我的git repo中有一个tmp目录我想仍然存在,但是被忽略了。我将其添加到.gitignore
,但git status
仍然告诉我该目录中文件的更改。我尝试了git rm -r --cached
,但是将其从远程仓库中删除了。如何停止跟踪对此目录的更改,但仍允许它存在?我还需要对1个文件执行此操作,但对git status
.gitignore
之后的更改也会显示在{{1}}中。我该怎么办?
答案 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
并使用特定于计算机的设置进行修改。