忽略已签入目录的内容?


227

我有一个git存储库,该存储库仅用于保存多个项目中使用的图形和声音文件。它们都在一个目录中,没有子目录。现在,我刚刚创建了一个脚本,以将这些资产从具有多个子目录级别的另一个结构化目录中复制过来。

现在,我只希望git跟踪(源)分层文件结构,并且(目标)平面目录(所有文件都放在一堆中)应该被忽略。

我已经将目标目录添加到.gitignore中,但是git仍在跟踪其中的更改。我以为如果我删除了目标目录中的旧文件,git可能会停止跟踪新内容(由脚本复制),但事实并非如此。

如何使git忘记目标目录?


目录名是什么,您放在.gitignore中是什么
mmmmmm 2009年

1
名称为DirNameIrrelevant,在.gitignore中,我尝试放置“ DirNameIrrelevant”,“ DirNameIrrelevant /”和“ DirNameIrrelevant / *”
Felixyz,2009年

Answers:


524

此命令将导致git取消跟踪目录及其下的所有文件,而没有实际删除它们:

git rm -r --cached <your directory>

-r选项将导致删除目录下的所有文件。

--cached选项导致仅从git的索引中删除文件,而不从工作副本中删除文件。默认情况下git rm <file>将删除<file>


嗯谢谢 非常有用,尽管我不明白为什么这是必要的(为什么在.gitignore中添加目录还不够?)。你能告诉我--cached是做什么用的吗?
Felixyz 2009年

当然。我已经修改了答案,以描述这两种选择。
戈登·威尔逊,

至于为什么有这个必要,我只能推测。我猜想创建者希望对文件进行脱轨是明确的,以减少错误地对项目的重要部分进行脱轨的风险。我想也有技术原因。
高登·威尔逊

15
gitignore用于确定git将知道哪些未跟踪的文件;它与已经被跟踪的文件无关。如果用户想跟踪否则被忽略的文件,则git允许它们。可以使用add -f您的情况来完成此操作。正如戈登所说,这可以防止您意外删除一堆文件-存储库是主列表,而不是gitignore。这也使您可以手动跟踪一些通配符规则会忽略的内容,这些都是我发现有用的。
卡斯卡贝尔

-r选项不是“导致删除目录下的所有文件”,而是通过子目录递归。
MrE 2015年

78

如果需要跟踪文件(已签入),但又不想跟踪文件的进一步更改同时将其保留在本地存储库和远程存储库中,则可以使用以下方法完成:

git update-index --assume-unchanged path/to/file.txt

之后,对该文件的任何更改将不再显示在中git status


1
尽管OP可能要求提供目录,但这正是我在寻找的内容-忽略对单个签入文件的进一步更改;谢谢!
sdaau 2014年

1
要完全忽略目录,请使用'git update-index --assume-unchanged dirName / *'。我花了一段时间才找到语法,这里需要'*'
J-Dizzle

1
一个人将如何扭转这种状况?
Rhys

3
@Rhys扭转它:git update-index --no-assume-unchanged dirname/**/*
JobJob

3

对于名为blah/git 的子目录,以下两个似乎都可以忽略中的新文件blah/。添加到.gitignore:

blah 
blah/*

1

TL; DR清理您的git存储库,并确保所有被忽略的项确实被忽略:

git rm -r --cached .
git add .
git commit -m "Clean up ignored files"

注意:您无需指定目录,这样您便可以清理整个远程仓库

要进一步阅读此内容


0

不知道这是否有价值或使我成为一个坏人,但这确实可行。

  1. 我添加*Generated*到根.gitignore文件
  2. 我提交了要保留为GeneratedFile.Whatever.ext的文件。入住
  3. 我在结帐后制作了一个git hook,以调用powershell脚本执行此操作:

dir *.CheckedIn -Recurse | %{ copy $_.FullName "$($_.FullName)".Replace("CheckedIn","") -EA SilentlyContinue}

我的确对自己感到难过……但这确实有效。


-2

好的,看来您必须首先在目录完全为空的情况下进行检入(无论新文件还是旧文件),之后添加的任何文件都将被忽略。如果在提交之前删除了旧文件add和new,则将新文件添加到存储库中,尽管应将其忽略。

至少,在这种情况下,这对我有用。如果有人可以对正在发生的事情提供更多的见解,那仍然会很棒。


1
我们在其他地方说过的内容的简短版本-gitignore影响git将意识到的未跟踪数据。它不会影响您对数据的处理(例如,指示将其添加到存储库中)。
卡斯卡贝尔

因此,应该这样跟踪已跟踪并现在删除的文件是有意义的,但是对我跟踪添加的文件(如果在下一次提交之前完成)仍然没有意义,而如果我是1)忽略,2)删除文件,3)提交,4)添加新文件,则不会跟踪新文件。
Felixyz
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.