告诉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中。 据我所知,这是不可能的,或者是吗?
这似乎是一个更好的主意
find . -type l | sed -e s'/^\.\///g' >> .gitignore
查找为所有文件输出一个“ ./”前缀。 除非您将其修剪掉,否则gitignore无法对其执行操作。 在一开始修剪“。\”后,它就像一个吊饰
根据您使用的git版本,应遵循符号链接。 有一个配置设置core.symlinks,可以设置为false,因此不让git跟随它们作为目录(假设git> = 1.6)。 让您的符号链接脚本还将这些链接附加到.gitignore文件中,或者只是自己添加它们,似乎是完全合理的。 您也可以做类似find . -type l >> .gitignore
的操作
我们有一个类似的问题,我们需要忽略一个符号链接目录或一个真实目录,而不是一个同名子目录或一个以相同字母开头的文件。 例如:
- 忽略-(符号链接)./media
- 忽略-(目录)./media
- 不要忽略-./something/media
- 不要忽略-./media.bak
- 不要忽略-./media-somethingelse
我最终在.gitignore中使用了它:
media
!*/media
看起来有些奇怪,但是基本上是说(第1行)忽略了所有“媒体”,但是(第2行)没有忽略了不在根目录中的任何“媒体”。 这种方法确实需要一点特殊性(关于不忽略子目录中的内容),但是应该很容易适应/扩展。
我对另一个问题的回答是相关的:
for f in $(git status --porcelain | grep '^??' | sed 's/^?? //'); do
test -L "$f" && echo $f >> .gitignore;
test -d "$f" && echo $f\* >> .gitignore;
done
我使用了最适合我的解决方案-命名协议。
带文件在我的解决方案中,每个文件符号链接都有一个前缀,例如“ 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
我没有将可执行文件和符号链接保留在我的存储库中...因此,当我执行“ git status”时,我也想忽略它们。
如果像我一样想要忽略符号链接,目录和可执行文件(例如$ NAG_HOME / libexec中的某些文件,则可以将这些文件添加到.gitignore中,如下所示:
file * | egrep 'ELF|symbolic|directory' | awk -F\: '{ print $1 }' >> .gitignore
echo ".gitignore" >> .gitignore
然后,当您处于git状态时,如果您没有将这些文件列表添加到存储库中,则不会吐出这些文件列表。
我的解决方案似乎很愚蠢,但是我宁愿这样做,也不愿每次添加新文件时都更新.gitignore文件。
我只是保留链接的默认名称,例如“链接到xxx”,然后将以下行添加到我的.gitignore文件中:
link to *
然后,您只需确保不使用以“ link to”开头的名称来命名其他文件/文件夹,即可对您进行排序。