告诉git忽略符号链接

这个问题在这里和这里都以类似的形式出现,但是它们似乎与我所寻找的不匹配。

我正在使用Ruby静态站点生成器StaticMatic进行项目。 基本上,这只是一个带有Haml模板,Sass和CoffeeScript的src /目录。 StaticMatic提供了一个开发服务器来将它们不断编译到一个静态站点中,并提供了一个在build /中生成静态站点的生成命令。

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

到目前为止,一切都很好。 (处理冲突等)

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

困难在于git希望将这些符号链接视为文件。 例如src/_modules/bar/foo.haml显示:

# 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

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

我理想的解决方法是:

[filetype = link]

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

user225643 asked 2020-02-29T10:54:01Z
7个解决方案
21 votes

这似乎是一个更好的主意

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

查找为所有文件输出一个“ ./”前缀。 除非您将其修剪掉,否则gitignore无法对其执行操作。 在一开始修剪“。\”后,它就像一个吊饰

Biswajit_86 answered 2020-02-29T10:54:19Z
18 votes

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

edwardsharp answered 2020-02-29T10:54:39Z
10 votes

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

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

我最终在.gitignore中使用了它:

media
!*/media

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

Chris Rasys answered 2020-02-29T10:55:31Z
3 votes

我对另一个问题的回答是相关的:

for f in $(git status --porcelain | grep '^??' | sed 's/^?? //'); do
    test -L "$f" && echo $f >> .gitignore;
    test -d "$f" && echo $f\* >> .gitignore;
done
ColinM answered 2020-02-29T10:55:50Z
1 votes

我使用了最适合我的解决方案-命名协议。

带文件在我的解决方案中,每个文件符号链接都有一个前缀,例如“ 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 
Dmitry Astafyev answered 2020-02-29T10:56:24Z
0 votes

我没有将可执行文件和符号链接保留在我的存储库中...因此,当我执行“ git status”时,我也想忽略它们。

如果像我一样想要忽略符号链接,目录和可执行文件(例如$ NAG_HOME / libexec中的某些文件,则可以将这些文件添加到.gitignore中,如下所示:

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

   echo ".gitignore" >> .gitignore

然后,当您处于git状态时,如果您没有将这些文件列表添加到存储库中,则不会吐出这些文件列表。

Larry Helms answered 2020-02-29T10:56:53Z
0 votes

我的解决方案似乎很愚蠢,但是我宁愿这样做,也不愿每次添加新文件时都更新.gitignore文件。

我只是保留链接的默认名称,例如“链接到xxx”,然后将以下行添加到我的.gitignore文件中:

link to *

然后,您只需确保不使用以“ link to”开头的名称来命名其他文件/文件夹,即可对您进行排序。

L33tCh answered 2020-02-29T10:57:22Z
translate from https://stackoverflow.com:/questions/8650871/telling-git-to-ignore-symlinks