告诉 git 忽略符号链接

这个问题已经出现在类似的形式 给你给你,但他们似乎不符合我所寻找的。

我在 StaticMatic 中做了一个项目,一个 Ruby 静态站点生成器。基本上,它只是一个包含 Haml 模板、 Sass 和 CoffeeScript 的 src/目录。StaticMatic 提供了一个开发服务器,可以将它们编译成静态站点,还提供了一个在 build/中生成静态站点的 build 命令。

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

到目前为止一切顺利(冲突得到处理等等)

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

问题是 git 希望将这些符号链接视为文件:

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

当我真的只想它显示 src/_modules/bar/foo.haml和忽略 src/foo.haml

一种方法是让我的链接生成代码将链接附加到。吉蒂诺尔,不过是在捣乱。我觉得吉蒂诺尔程序化很容易出错。(也许这种担忧是不合理的?)

我的理想解决方案是这样的:

[filetype = link]

就我所知,这是不可能的,是吗?

66415 次浏览

根据您使用的 git 版本,它应该遵循符号链接。有一个配置设置 core.symlinks,它可能被设置为 false,因此不允许 git 作为目录跟随它们(假设 git > = 1.6)。让符号链接脚本也将这些链接附加到。或者自己添加它们。你也可以做类似 find . -type l >> .gitignore的事情

这似乎是个更好的主意

find . -type l | sed -e s'/^\.\///g' >> .gitignore

查找输出 a”。所有文件的前缀。除非你把它剪掉,否则吉蒂诺尔无法对它们采取行动。一旦你修剪了。开始的时候,效果非常好

我从 另一个问题得到的答案是相关的。

此方法只添加未跟踪的符号链接,因此可以重复使用,而无需添加重复的条目、子模块中的符号链接或已被忽略的符号链接,或故意跟踪的符号链接。

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

我没有将可执行文件和符号链接保存在我的存储库中... ... 所以当我执行“ git 状态”时,我也想省略它们。

如果像我一样,您想忽略符号链接、目录和可执行文件(ala $NAG _ HOME/libexec 中的一些文件,您可以将这些文件添加到。吉蒂诺尔如下:

   file * | egrep 'ELF|symbolic|directory' | awk -F\: '{ print $1 }' >> .gitignore


echo ".gitignore" >> .gitignore

然后,当您执行 git 状态时,如果您没有将这些文件添加到存储库中,它就不会返回这些文件的列表。

我们有一个类似的问题,我们需要忽略符号链接目录 或者一个真正的目录,但是 没有一个相同名称的子目录 或者一个文件以相同的字母开头。例如:

  • Ignore-(symlink) ./media
  • Ignore-(目录) ./media
  • 不要忽略-./something/media
  • 不要忽略-./media.bak
  • 不要忽略-./media-something

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

media
!*/media

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

我的解决方案可能看起来很愚蠢,但是我宁愿这样做也不会更新。每次添加一个新文件时都要放弃一个 gitignore 文件。

我只是使用默认名称(如“ link to xxx”)保留链接,然后将下面一行添加到。Gitignore 文件:

link to *

然后,您只需确保不会以“ link to”开头的名称命名任何其他文件/文件夹,就可以进行排序了。

我用最合适的解决方案对我命名协议。

还有文件 我的解决方案中的每个到文件的符号链接都有一个前缀,名称类似于“ bla.outsidemodule.ts”。 在. gitignore 文件中,我只有:

**/*.outsidemodule.*

还有文件夹 同样在解决方案的根目录中,我有一个文件夹“ Platform”,其中包含解决方案其他部分的公共库/模块。结构是这样的:

 - ./platform              <- sources
- ./client/src/platform   <- symlink to ./platform
- ./server/src/platform   <- symlink to ./platform
- ./exchange/src/platform <- symlink to ./platform
- ./service/src/platform  <- symlink to ./platform

而在. gitignore 只是:

**/platform <- exclude all "platform" folders
!./platform <- do not exclude folder "platform" if it's on a root

如果你真的想忽略一个文件名,如果它是一个符号链接或文件,而不是如果它是一个目录,你可以添加到。吉蒂诺尔:

/media
!/media/

像@Chris _ Rasys 这样表述它,它会:

  • Ignore-(symlink) ./media
  • 忽略 -(文件) ./media
  • 不要忽略 -(目录) ./media
  • 不要忽略-./something/media
  • 不要忽略-./media.bak
  • 不要忽略-./media-something