代码之家  ›  专栏  ›  技术社区  ›  00__00__00

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

  •  0
  • 00__00__00  · 技术社区  · 8 年前

    我正在处理一个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中被gitignored的文件。

    我在这里试过一些答案:

    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文件,以便在新的工作副本中无缝地解压缩它。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Mark Adelsberger    8 年前

    好吧,我们可以看看怎么做 git check-ignore 工作得更好,但这似乎有点过于工程化。如果您只需要执行一次,只需找出将您知道的模式包含在忽略文件中的形式。(我忽略了这个目录,所以我将压缩这个目录。如果你需要经常这样做,你可能想重新审视一下你是如何使用忽略规则的。

    不管怎样, check-ignore 命令可以输出文件和/或目录,但有两个警告:

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

    git check-ignore * **/*
    

    但即使这样,排除目录时也会出现第二个问题 a/ ,该目录包含另一个目录 a/b/ . 有坏消息和坏消息。

    坏消息是,它不在里面搜索 A/B/ 即使与 **/* 模式;一旦它看到 A/B/ 被排除在外,它只是列出并继续。

    更糟糕的是,如果内部存在任何未排除的路径 A/B/ (例如,因为它们是在忽略路径之前添加的,或者因为它们是用 -f ) A/B/ 没有列出,它 仍然 不在下面搜索 A/B/ 以确定是否确实排除了更具体的路径。在我看来,这就像一只虫子。作为一个局部的工作,你可以说

    git check-ignore --no-index **/* *
    

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

    所以…如果您(a)知道索引不包含路径中文件的条目,否则将被忽略,或者(b)可以通过使用 --no-index ,然后可以使用“check ignore output”。在看到一个目录的情况下,只需在zip中包含整个目录(及其内容,递归地)。

    在这种情况下,如果复制一个不被真正忽略的文件,我想会做一些类似的事情

    git checkout -- a/b
    

    解压后,你的邮政编码应该解决这个问题。(您可以随时使用 git status 解压缩zip以验证是否有任何不被忽略的更改要撤消。)