从工作副本中备份所有gitignored文件

时间:2018-07-24 12:55:20

标签: git backup gitignore

我正在git存储库上工作。 我有一个工作副本,文件列表很大。

我的.gitignore看起来像

roo/output*  # ignore set of folders
*.pyc           # ignore a filetype
root/a_folder   # ignore a folder
root/filemame*.txt # ignore a set of files
root/**/.bin # ignore an extension within a folder

现在,我想创建一个新的工作副本。为了使其正常工作,我还需要原始wc中被忽略的文件。

我在这里尝试了一些答案:

Git command to show which specific files are ignored by .gitignore

git check-ignore * # return only folders for me

git status --ignored # takes forever to run
git ls-files --others -i --exclude-standard # returns empty for me

我需要使用原始路径名获得此列表,以便创建一个保持文件夹结构的zip文件,以便可以在新的工作副本中无缝地将其解压缩。

3 个答案:

答案 0 :(得分:1)

好吧,我们可以研究如何使git check-ignore更好地工作,但这似乎有点过度设计。如果只需要执行一次,则只需找出要包含在忽略文件中的模式中的内容即可。 (我将忽略此目录,因此将压缩此目录。等等。)如果您需要常规执行此操作,则可能需要重新考虑如何使用忽略规则。

无论如何,check-ignore命令可能会输出文件和/或目录,但有两个警告:

首先,您需要告诉它是否要搜索子目录。如果您只说git check-ignore *,那么它将仅搜索当前目录。相反,您可能想要

git check-ignore * **/*

但是即使如此,当您排除目录a/并且该目录包含另一个目录a/b/时,仍然会出现第二个问题。有一个坏消息和一个坏消息。

坏消息是,即使使用a/b/模式,它也不会在**/*内部进行搜索;一旦看到a/b/被排除,它就会列出并继续。

更糟糕的消息是,如果a/b/中存在任何未排除的路径(例如,因为它们是在忽略该路径之前添加的,或者因为它们是与-f一起添加的),则{{1 }}未列出,并且它 still 不在a/b/下进行搜索,以查找是否确实排除了更具体的路径。在我看来,这就像一个虫子。作为部分解决方法,您可以说

a/b/

,它将列出目录,但仍不会在目录内搜索-这意味着您有一些隐式误报(因为该目录中的某些内容是 个不被忽略的文件)。

所以...如果您要么(a)知道索引在路径中不包含文件条目,否则该文件会被忽略,或者(b)可以通过使用{{ 1}},那么您可以使用`check-ignore输出。如果您看到目录,则只需将整个目录(及其内容,以递归方式)包含在ZIP中。

如果这将复制一个未被真正忽略的文件,我想这样做

git check-ignore --no-index **/* *
提取您的ZIP后

应该可以解决该问题。 (提取ZIP后,您始终可以使用--no-index来验证是否有任何要撤消的不可忽略的更改。)

答案 1 :(得分:1)

这是对我有用的东西。首先,要进行检查,我列出了所有被忽略的文件,没有被忽略目录的内容(所以只是目录本身):

<Route path="/heroes" component={Heroes} />

然后,我通过此列表以单线压缩,以将所有内容保存到忽略文件.zip:

$ git ls-files -o -i --directory --exclude-standard
TODO
some/ignored/dir/

答案 2 :(得分:0)

另一种(有些被忽略)的方法是在空转模式下使用git clean

git clean -dxn

遍历所有子目录,吐出每个不在git上的文件的名称,无论是新文件还是被忽略的文件(-x标志确保输出中包括被忽略的文件)。

为了清除在Would remove输出的每一行上显示的前缀git-clean并将其发送到zip,请输入:

git clean -dxn | sed 's/^Would remove \(.*\)/\1/g' | zip -@ backup-file.zip