告诉git忽略符号链接

vxqlmq5t  于 2023-09-29  发布在  Git
关注(0)|答案(8)|浏览(112)

这个问题已经出现在类似的形式herehere,但他们似乎不符合我正在寻找的。
我正在用StaticMatic做一个项目,这是一个Ruby静态站点生成器。基本上,它只是一个src/目录,包含Haml模板、Sass和CoffeeScript。StaticMatic提供了一个开发服务器来不断地将这些站点编译成静态站点,以及一个在build/中生成静态站点的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]

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

vngu2lb8

vngu2lb81#

这似乎是个更好的主意

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

Find为所有文件输出“./”前缀。除非你修剪掉它,否则吉蒂格诺尔无法对它们采取行动。一旦你修剪了开头的“.”,它就像一个魔咒

eagi6jfj

eagi6jfj2#

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

qnyhuwrf

qnyhuwrf3#

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

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

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

media
!*/media

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

lc8prwob

lc8prwob4#

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
5f0d552i

5f0d552i5#

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

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

**/*.outsidemodule.*

With folders同样在解决方案的根目录下,我有一个文件夹“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
vlju58qv

vlju58qv6#

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

/media
!/media/

要像@Chris_Rasys一样制定它,这将:

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

cngwdvgl7#

我的解决方案可能看起来很傻,但我宁愿这样做,而不是每次添加新文件时都更新.gitignore文件。
我只是保留链接的默认名称,如“link to xxx”,然后将下面一行添加到我的.gitignore文件中:

link to *

然后,您只需确保您没有命名任何其他文件/文件夹的名称以“链接到”开头,并且您已排序。

1aaf6o9v

1aaf6o9v8#

我不保持可执行文件,和符号链接在我的仓库.所以当我写“git status”的时候我也想把它们省略掉。
如果像我一样,你想忽略符号链接,目录和可执行文件(例如$NAG_HOME/libexec中的一些文件),你可以将这些文件添加到.gitignore中,如下所示:

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

   echo ".gitignore" >> .gitignore

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

相关问题