Git 忽略已签入的目录';什么内容?

Git 忽略已签入的目录';什么内容?,git,version-control,Git,Version Control,我有一个git存储库,它只用于保存几个项目中使用的图形和声音文件。它们都在一个目录中,没有子目录。现在,我刚刚创建了一个脚本,用于从另一个结构化目录复制这些资产,该目录具有多个级别的子目录 现在我只希望git跟踪(源)层次文件结构,而(目标)平面目录(所有文件都在一堆中)应该被忽略 我已将目标目录添加到.gitignore,但git仍在跟踪其中的更改。我认为如果我在目标目录中删除旧文件,git可能会停止跟踪新内容(由脚本复制),但它不会 如何使git忘记目标目录?对于添加到git的名为blah/

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

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

我已将目标目录添加到.gitignore,但git仍在跟踪其中的更改。我认为如果我在目标目录中删除旧文件,git可能会停止跟踪新内容(由脚本复制),但它不会


如何使git忘记目标目录?

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

blah 
blah/*

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

git rm-r——缓存的

-r
选项会删除目录下的所有文件


--cached
选项使文件仅从git的索引中删除,而不是从您的工作副本中删除。默认情况下,
git rm
将删除

好的,似乎您必须首先签入目录,目录完全为空(既不是旧文件也不是新文件),此后添加的任何文件都将被忽略。如果在提交之前删除了旧文件add和新文件add,则新文件将添加到repo中,尽管它们应该被忽略


至少,在这种情况下,这对我是有效的。如果有人能提供更多关于正在发生的事情的信息,那就太好了。

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

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

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

中。我不确定这是否算数,也不确定这是否会使我成为一个坏人,但接下来就是了

  • 我将
    *Generated*
    添加到root.gitignore文件中
  • 我提交了我想作为GeneratedFile保留的文件。Whatever.ext.CheckedIn
  • 我在签出后使用git钩子调用powershell脚本来执行以下操作:
  • dir*.CheckedIn-Recurse |%{copy$\.FullName“$($\.FullName)”.Replace(“CheckedIn”,”)-EA SilentlyContinue}


    我确实对自己感到有点难过。。。但它确实起作用;DR清理您的git存储库并确保所有被忽略的项目确实被忽略:

    git rm -r --cached .
    git add .
    git commit -m "Clean up ignored files"
    
    注意:您不需要指定目录,这样您就可以清理整个远程repo


    要进一步阅读

    目录名是什么以及您输入了什么。gitignore目录名是dirnameinternect和in.gitignore我尝试输入“dirnameinternect”、“dirnameinternect/”和“dirnameinternect/*”啊,谢谢。非常有用,尽管我不明白为什么需要这样做(为什么在.gitignore中添加dir还不够?)。你能告诉我缓存的是什么吗?当然。我已经修改了我的答案来描述这两个选项。至于为什么这是必要的,我只能猜测。我猜创建者希望文件的取消跟踪是明确的,以减少错误取消跟踪项目重要部分的风险。我想也有技术原因。gitignore用于确定git将知道哪些未跟踪的文件;它与已被跟踪的文件无关。如果用户希望跟踪其他被忽略的文件,git允许它们。这可以使用
    add-f
    来完成,也可以根据您的情况来完成。正如Gordon所说,这可以防止您意外地删除一堆文件—存储库是主列表,而不是gitignore。这还允许您手动跟踪一些本来会被通配符规则忽略的内容,我发现这很有用。
    -r
    选项不是“导致删除目录下的所有文件”而是通过subdirs.Short版本的我们在别处所说的递归-gitignore会影响git将意识到的未跟踪数据。它不会影响对您告诉它的数据所做的操作(例如,指示它添加到存储库)。因此,应该这样跟踪被跟踪和现在被删除的文件是有意义的,但对我来说,跟踪添加的文件(如果在下一次提交之前完成)仍然没有意义,而如果我1)忽略,2)删除文件,3)提交,4)添加新文件,新文件不会被跟踪。虽然OP可能要求提供一个目录,但这正是我想要的-忽略对单个签入文件的进一步更改;谢谢要完全忽略目录,请使用“git update index--假定dirName/*”命令。我花了一段时间才找到语法,“*”在这里是必需的,我们如何扭转它?@Rhys扭转它:
    git update index——不,假设未更改的dirname/***
    这将在您实际使用repo时立即消失。我的钱不见了。