我仅为文本文件创建了白名单。
*
!*.txt
现在,我在子目录-sub/dir/file.txt
中有未跟踪的文本文件,并且未显示(忽略)。但是,显示了根目录中的文本文件。
为什么,如何解决?
如果以这种方式尝试,它将失败,因为您最终会将结构中的目录列入黑名单。
要解决,您要将所有不是目录的文件,也不是要提交的文件类型之一列入黑名单,而不是将目录黑名单。
将执行此操作的.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)。
我搜索了很长时间:
假设我有一个大文件夹结构,其中递归嵌套了〜100.000个目录。在这些文件夹中,大约有30.000个文件的类型为.txt
(在我的情况下为:键入*.md
)。
我想让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
文件.txt
或.md
文件。确保在git-for-windows安装过程中检查了Enable symbolic link
-support。注:
目标中的文件被符号链接到源,因此任何更新将直接提供给目标中的git。但是,每次将新的*.md
(或*.txt
)添加到原始文件夹时,都必须再次执行脚本。
我仍然喜欢这种方法,因为它使我可以更精细地控制要跟踪的内容。我主要使用这种方法将数千个notes.md
和目录结构同步到一个中央位置,因此我可以在家中查找在工作中所做的工作。有时,我也想跟踪一个重要的*.sh
文件(或其他文件类型),在这种情况下,我会在monitor-notes-repo中创建一个手动符号链接。