我有一个Git仓库,仅用于保存多个项目中使用的图形和声音文件。它们都在一个没有子目录的目录中。现在我刚刚创建了一个脚本,将这些资产从另一个带有几级子目录的结构化目录复制过来。
现在我只想让(源)分层文件结构被Git跟踪,而(目标)扁平目录(所有文件都在一堆中)应该被忽略。
我已经将目标目录添加到.gitignore中,但Git仍然会跟踪其中的更改。我认为如果提交对目标目录中旧文件的删除,Git可能会停止跟踪新内容(由脚本复制),但实际并没有。
如何让Git忘记目标目录?
我有一个Git仓库,仅用于保存多个项目中使用的图形和声音文件。它们都在一个没有子目录的目录中。现在我刚刚创建了一个脚本,将这些资产从另一个带有几级子目录的结构化目录复制过来。
现在我只想让(源)分层文件结构被Git跟踪,而(目标)扁平目录(所有文件都在一堆中)应该被忽略。
我已经将目标目录添加到.gitignore中,但Git仍然会跟踪其中的更改。我认为如果提交对目标目录中旧文件的删除,Git可能会停止跟踪新内容(由脚本复制),但实际并没有。
如何让Git忘记目标目录?
这个命令将导致git取消跟踪您的目录和其下的所有文件,而不实际删除它们:
git rm -r --cached <您的目录>
-r
选项导致删除您的目录下的所有文件。
--cached
选项使文件仅从git索引中删除,而不是从您的工作副本中删除。默认情况下,git rm <file>
将删除<file>
。
.gitignore
用于确定git将会关注哪些未跟踪的文件,它与已经被跟踪的文件无关。如果用户想要跟踪被忽略的文件,git会允许他们这样做。可以使用add -f
命令执行此操作,或者根据您的情况进行处理。正如Gordon所说,这可以防止您意外删除一堆文件——代码库是主列表,而不是.gitignore
。这还可以手动跟踪一些通配符规则会忽略的内容,我发现这很有用。 - Cascabelgit rm
是用于删除文件,而 -r
则是递归子目录:两个不同的功能组合在一起确实会导致删除目录下的所有文件。如果我执行 git ls-tree -r
命令,则 -r
不会删除目录下的所有文件。 - MrE如果您需要在本地仓库和远程仓库中都保留一个已跟踪的文件(已检入),但不希望继续跟踪文件的更改,可以通过以下方式实现:
git update-index --assume-unchanged path/to/file.txt
之后对该文件的任何更改都将不再显示在 git status
中。
要撤消此操作,请使用以下命令:
git update-index --no-assume-unchanged path/to/file.txt
git update-index --no-assume-unchanged dirname/**/*
。 - JobJob简而言之,清理你的git仓库并确保所有被忽略的项目都确实被忽略:
git rm -r --cached .
git add .
git commit -m "Clean up ignored files"
对于添加到git的名为blah/
的子目录,以下两种方法似乎都可以忽略blah/
中的新文件。在.gitignore中添加:
blah
blah/*
不确定这是否算数或让我成为一个坏人,但是我还是要说。
*Generated*
添加到根目录的 .gitignore 文件中dir *.CheckedIn -Recurse | %{ copy $_.FullName "$($_.FullName)".Replace("CheckedIn","") -EA SilentlyContinue}
我对自己有点内疚...但它确实有效。
好的,看起来你必须先使用完全空的目录进行签入(既没有旧文件也没有新文件),之后添加的任何文件都将被忽略。如果在提交之前删除旧文件并添加新文件,则新文件将被添加到仓库中,尽管它们应该被忽略。
至少,在这种情况下,这对我有效。如果有人能够提供更多关于发生了什么的见解,那就太好了。