Git中的白名单和子目录

问题描述 投票:80回答:2

我仅为文本文件创建了白名单。

*
!*.txt

现在,我在子目录-sub/dir/file.txt中有未跟踪的文本文件,并且未显示(忽略)。但是,显示了根目录中的文本文件。

为什么,如何解决?

git gitignore
2个回答
131
投票

如果以这种方式尝试,它将失败,因为您最终会将结构中的目录列入黑名单。

要解决,您要将所有不是目录的文件,也不是要提交的文件类型之一列入黑名单,而不是将目录黑名单

将执行此操作的.gitignore文件:

# First, ignore everything
*
# Now, whitelist anything that's a directory
!*/
# And all the file types you're interested in.
!*.one
!*.two
!*.etc

[使用存在于存储库根目录中的.txt*.one*.two*.three文件存在的情况下针对.gitignore文件在三级结构白名单中对此进行了测试-适用于我。您无需将.gitignore文件添加到结构中的所有目录中。

我以前想出答案的信息来自this(stackoverflow.com)。


0
投票

我搜索了很长时间:

  1. 假设我有一个大文件夹结构,其中递归嵌套了〜100.000个目录。在这些文件夹中,大约有30.000个文件的类型为.txt(在我的情况下为:键入*.md)。

  2. 我想让git只跟踪所有文件夹和子目录中的.txt(或*.md)文件。

正确的答案应该是:这在Git中是不可能的。

我做了什么:

1a。 WSL(改编自here

  • 创建文件batch_link.cmd(内容见下文)
  • 以管理员身份执行
@ECHO ON

SET SrcRoot=Z:\Source
SET TargetRoot=Z:\Destination

SETLOCAL ENABLEDELAYEDEXPANSION
FOR /R "%SrcRoot%" %%A IN ("*.md") DO (
  SET oDir=%%~DPA
  SET oFile=%%~A
  IF NOT EXIST "%TargetRoot%!oDir:~4!" MD "%TargetRoot%!oDir:~4!"
    IF NOT EXIST "%TargetRoot%!oFile:~4!" MKLINK "%TargetRoot%!oFile:~4!" "%%~A"
  )

PAUSE
EXIT

1b。 Linux

find /z/source -name '*.md' -exec cp -s --parents \{\} /z/destination \;

2。现在在/z/destination(或Z:\Destination)中创建一个git存储库

  • git init
  • git status -u检查文件列表,在我的情况下,仅列出*.md文件
  • 如果使用的是WSL / Windows:Linux / WSL git doesn't understand使用mklink创建的Windows符号链接。对于Windows,您需要使用git来提交那些符号链接的.txt.md文件。确保在git-for-windows安装过程中检查了Enable symbolic link -support。

目标中的文件被符号链接到源,因此任何更新将直接提供给目标中的git。但是,每次将新的*.md(或*.txt)添加到原始文件夹时,都必须再次执行脚本。

我仍然喜欢这种方法,因为它使我可以更精细地控制要跟踪的内容。我主要使用这种方法将数千个notes.md和目录结构同步到一个中央位置,因此我可以在家中查找在工作中所做的工作。有时,我也想跟踪一个重要的*.sh文件(或其他文件类型),在这种情况下,我会在monitor-notes-repo中创建一个手动符号链接。

© www.soinside.com 2019 - 2024. All rights reserved.