告诉git忽略符号链接

use*_*643 50 git symlink gitignore

这个问题在这里这里以类似的形式出现,但它们似乎与我正在寻找的东西不相符.

我在StaticMatic中创建了一个项目,这是一个Ruby静态站点生成器.基本上,它只是一个带有Haml模板,Sass和CoffeeScript的src /目录.StaticMatic提供了一个开发服务器,可以将这些服务器编译为静态站点,以及在build /中生成静态站点的构建命令.

我对StaticMatic的修改是允许添加src/_modules/foo /,它可能包含src/_modules/foo/bar.haml.运行服务器或构建站点时,将在src/bar.haml创建一个符号链接,指向foo /中的文件.

到现在为止还挺好.(处理冲突等)

_modules /中单独目录背后的原因是它们可以作为git子模块进行跟踪,并由其他团队独立检出.从本质上讲,这允许多个团队在一个静态站点中的不同页面(实际上是JS应用程序)上工作,而不会复制主要布局等.

问题是,git想要将这些符号链接视为文件.例如,git status显示:

# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be commited)
#
#       src/_modules/bar/foo.haml
#       src/foo.haml
Run Code Online (Sandbox Code Playgroud)

......当我真的只是希望它展示src/_modules/bar/foo.haml和忽视时src/foo.haml

一种方法是让我的链接生成代码将链接附加到.gitignore,但是以编程方式搞乱.gitignore会让我觉得容易出错.(也许这种担忧是不合理的?)

我的理想修复方式如下:

[filetype = link]
Run Code Online (Sandbox Code Playgroud)

......在.gitignore.据我所知,这是不可能的,或者是这样吗?

Bis*_*_86 21

这似乎是一个更好的主意

find . -type l | sed -e s'/^\.\///g' >> .gitignore
Run Code Online (Sandbox Code Playgroud)

查找输出所有文件的"./"前缀.除非你把它修剪掉,否则gitignore无法对它们采取行动.一旦你开始修剪".\",它就像一个魅力

  • 不需要sed.将`.`替换为`*`:`find*-type l >> .gitignore` (10认同)
  • 如何使用 `find 。-type l -printf '%P\n'`?不涉及`sed`,因此对于大型存储库应该更快.. (3认同)
  • 我只想要当前目录中的链接,所以我做了 `find * -maxdepth 1 -type l &gt;&gt; .gitignore`。我想互联网上的其他人会发现这很有用 (3认同)
  • @ Biswajit_86`find .`在`。/`之前加上,但是`find *`则没有。我认为这就是@nickptrvc所说的。我不知道其他所有内容是否保持不变,但乍一看似乎如此。 (2认同)

edw*_*arp 18

根据您使用的git版本,它应该遵循符号链接.有一个配置设置core.symlinks,可以设置为false,因此不要让git跟随它们作为目录(假设git> = 1.6).让符号链接脚本也将这些链接附加到.gitignore文件或者自己添加它们似乎是完全合理的.你也可以这样做find . -type l >> .gitignore

  • `git config core.symlinks false`(对于那些浏览的人来说).但请注意,这会将符号链接检查为文本文件,其目标可能在其他用户的系统上无效. (4认同)

Chr*_*sys 11

我们遇到了类似的问题,我们需要忽略符号链接目录真实目录,但不能忽略同名子目录以相同字母开头的文件.例如:

  • 忽略 - (符号链接)./ media
  • 忽略 - (目录)./ media
  • 不要忽视 - ./something/media
  • 不要忽视 - ./media.bak
  • 不要忽视 - ./media-somethingelse

我最终在.gitignore中使用了这个:

media
!*/media
Run Code Online (Sandbox Code Playgroud)

这看起来有点奇怪,但基本上是说(第1行)忽略所有"媒体",但(第2行)不要忽略任何不在根目录中的"媒体".这个方法确实需要一点特异性(关于不忽略子目录中的东西),但应该很容易适应/扩展.

  • 你可以做`/ media`.绝对路径是指包含gitignore文件的目录. (7认同)

Col*_*inM 6

我在另一个问题中的回答是相关的。

此方法仅添加未跟踪的符号链接,因此可以在不添加重复条目、子模块中或已被忽略的符号链接或有意跟踪的符号链接的情况下重复。

for f in $(git status --porcelain | grep '^??' | sed 's/^?? //'); do
    test -L "$f" && echo $f >> .gitignore;
    test -d "$f" && echo $f\* >> .gitignore;
done
Run Code Online (Sandbox Code Playgroud)