我习惯了rcs。签入后,我通常会执行rcsclean以删除所有存在的跟踪罚款,以便目录中只存在未跟踪的文件。我有时会执行 rcsclean -u 来撤消对跟踪文件的任何更改。
我如何在 git 中做到这一点?
之后,当前目录及其子目录中应该只有未跟踪的文件(当然 .git 存储库本身除外)。
Git 不是 RCS。你可以做你想做的事,但你会因为试图将 Git 存储库视为基于文件的修订控制系统而给自己带来长期的痛苦。
您可以删除 Git 正在跟踪的文件,但是具有更大/更深目录树的项目将需要您采取额外的步骤来删除空目录(Git 不会将其作为一等对象进行跟踪),您将失去这样做的能力比如git commit -a
没有 Git 认为你正在删除所有文件。
您可以使用子命令删除 Git 知道的所有文件ls-files
。您需要将输出通过管道传输到xargs,因为该rm
命令本身不处理以 null 结尾的字符串,并且像“foo bar/baz quux”这样的路径会在没有它们的情况下导致问题。
要删除提交给 Git 的所有文件:
$ git ls-files -z | xargs -0 -- rm -f
然而,Git 并不真正跟踪目录。它跟踪树木。因此,除非您将所有文件都放在项目的根目录中,否则如果您希望它们也消失,则需要自己将空目录作为单独的命令删除。例如:
$ find . -type d -empty -not -path '*.git*'
完成此操作后,您需要避免git commit -a
将所有丢失的文件视为已删除的命令。相反,您必须更加小心地暂存文件。您可能还想调查man git-update-index
并考虑该--assume-unchanged
标志是否会帮助您的情况或使情况变得更糟。
此外,该git status
命令将继续显示大量更改,因为您已从工作树中删除了文件。如果您从工作树中“清理”了大量文件,则类似命令的输出git status
可能会变得如此混乱,以至于如果没有过滤就变得毫无用处。例如,要查找真正未被跟踪而不是删除或修改的文件:
$ git status -su | fgrep '??'
?? bar
?? wibble
Git 和 RCS 有不同的用例。想要清除你的 Git 工作树是非常不寻常的,所以我假设这是一个 X/Y 问题,你试图查看哪些文件当前未跟踪。
为此有一个内置的 Git 命令:git status --untracked-files
. 此命令的默认模式是all,而不是git status
(不带标志)的输出默认为normal。详情请参阅man 1 git-status
。
mkdir -p foo/bar/baz
touch foo/quux foo/bar/wibble
git status -u
On branch master Untracked files: (use "git add <file>..." to include in what will be committed) foo/bar/wibble foo/quux nothing added to commit but untracked files present (use "git add" to track)
请注意,此输出中永远不会显示没有文件的目录树。这是因为 Git 不跟踪目录,除非作为树对象的一部分,因此从这个示例中,除非目录树中的bazfoo/bar/baz
内或下面存在文件(又名目录条目),否则永远不会显示为未跟踪。
换句话说,要让 baz显示为未跟踪,baz 中必须有一个文件,或者baz的子目录必须包含一个文件。例如,使用标志以获得更简洁的输出:--short
$ touch foo/bar/baz/file; git status -s -u
?? foo/bar/baz/file
?? foo/bar/wibble
?? foo/quux
将包含foo/bar/baz/file
在输出中。人们经常.gitkeep
为此目的使用空的隐藏文件。