我如何使用像rcsclean这样的git来干净

时间:2016-03-11 00:36:42

标签: git version-control rcs

我习惯rcs。签入后,我通常会rcsclean删除所有存在的跟踪罚款,以便目录中只存在未跟踪的文件。我有时会使用rcsclean -u撤消对已跟踪文件的任何更改。

我如何在git中执行此操作?

之后,当前目录中应该只有未跟踪的文件及其子目录(当然除了.git存储库本身)。

2 个答案:

答案 0 :(得分:1)

TL; DR

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状态

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这样的空隐藏文件来实现此目的。