0

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

我如何在 git 中做到这一点?

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

4

2 回答 2

2

TL;博士

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
于 2016-03-14T00:43:51.020 回答
0

使用 Git 状态

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为此目的使用空的隐藏文件。

于 2016-03-12T19:38:30.340 回答