告诉git忽略符号链接

时间:2011-12-28 01:10:42

标签: git symlink gitignore

此问题以herehere的相似形式出现,但它们似乎与我正在寻找的内容不符。

我在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

...当我真的希望它显示src/_modules/bar/foo.haml并忽略src/foo.haml

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

我理想的解决方法是:

[filetype = link]

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

8 个答案:

答案 0 :(得分:21)

这似乎是一个更好的主意

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

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

答案 1 :(得分:17)

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

之类的操作

答案 2 :(得分:10)

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

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

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

NSString *decimalSeparator = [[NSLocale currentLocale] objectForKey:NSLocaleDecimalSeparator];
formatter.positiveFormat = [NSString stringWithFormat:@"###%@00", decimalSeparator];

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

答案 3 :(得分:3)

another question的答案是相关的:

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

答案 4 :(得分:1)

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

带有文件 在我的解决方案中,每个指向文件的符号链接都有一个前缀,例如“ 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 

答案 5 :(得分:0)

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

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

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

   echo ".gitignore" >> .gitignore

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

答案 6 :(得分:0)

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

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

link to *

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

答案 7 :(得分:0)

如果您真的想忽略文件名(如果它是符号链接或文件),而不是目录(如果不是目录),则可以添加到.gitignore:

/media
!/media/

要像@Chris_Rasys一样来表达它,这将是:

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