我习惯rcs。签入后,我通常会rcsclean删除所有存在的跟踪罚款,以便目录中只存在未跟踪的文件。我有时会使用rcsclean -u撤消对已跟踪文件的任何更改。
我如何在git中执行此操作?
之后,当前目录中应该只有未跟踪的文件及其子目录(当然除了.git存储库本身)。
答案 0 :(得分:1)
Git不是RCS。你可以做你想做的事,但是通过尝试将Git存储库视为基于文件的修订控制系统,你会给自己带来长期的痛苦。
您可以删除Git正在跟踪的文件,但是具有更大/更深目录树的项目将需要您采取额外步骤来删除空目录(Git不会将其作为第一类对象进行跟踪),如果没有Git认为你正在删除所有文件,你将无法执行git commit -a
之类的事情。
您可以使用ls-files
子命令删除Git知道的所有文件。您需要将输出传递给 xargs ,因为rm
命令本身不处理以null结尾的字符串,而像“foo bar / baz quux”这样的路径会在没有它们的情况下导致问题。 / p>
删除所有提交给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
答案 1 :(得分:0)
Git和RCS有不同的用例。想要清除你的Git工作树是非常不寻常的,所以我假设这是一个X / Y问题,你试图查看当前未跟踪的文件。
有一个内置的Git命令:git status --untracked-files
。此命令的默认模式是 all ,而不是默认为 normal 的git status
(没有标志)的输出。有关详细信息,请参阅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不跟踪目录,因此除非在 baz 之内或之下存在文件(aka目录条目),否则此示例中的foo/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
这样的空隐藏文件来实现此目的。