从Markdown文件到Repo根的相对链接

时间:2016-11-04 12:33:28

标签: github markdown readme

我需要从markdown文件

获得我的repo根目录的相对链接

(我需要它适用于任何叉子)

所以它看起来像是在根目录中提供某个文件的链接的唯一方式:

the [Root](/README.md)

the [Root](../README.md)

(例如,如果它位于/doc/README.md)

同时我可以在不引用文件的情况下引用任何文件夹

the [Doc](/doc)

但是如果我尝试将链接放到根文件夹中:

the [real root](/)

the [real root](../)

我会有一个这样的链接

https://github.com/UserName/RepoName/团块/主

不同

https://github.com/UserName/RepoName/团块/主 /文档

指的是404

所以,如果我不想在根目录中引用README.md(我根本就没有它)

有没有办法建立这样的链接?

2 个答案:

答案 0 :(得分:11)

经过一些研究,我发现了这样的解决方案:

[the real relative root of any fork](/../../)

它始终指向默认分支。对我来说没问题,所以由你决定

PS

通过这样的技巧,您还可以访问以下功能:

[test](/../../tree/test) - 链接到另一个分支

[doc/readme.md](/../../edit/master/doc/readme.md) - 在编辑器中打开

[doc/readme.md](/../../delete/master/doc/readme.md) - 要求删除文件

[doc/readme.md](/../../commits/master/doc/readme.md) - 历史

[doc/readme.md](/../../blame/master/doc/readme.md) - 责备模式

[doc/readme.md](/../../raw/master/doc/readme.md) - 行模式(将重定向)

[doc/](/../../new/master/doc/) - 要求创建新文件

[doc/](/../../upload/master/doc/) - 要求上传文件

[find](/../../find/test) - 查找文件

答案 1 :(得分:2)

您可以直接链接到文件(../README.md),也可以直接使用完整的绝对网址直接链接到repo根:https://github.com/UserName/RepoName

使用相对链接在GitHub上运行得不好。请注意以下两个网址之间的区别:

https://github.com/UserName/RepoName/tree/master/somedir
https://github.com/UserName/RepoName/blob/master/somedir/somefile

请注意,第一个指向目录,第二个指向文件。然而,在" RepoName"之后对于文件,我们有tree(对于目录)或blob。因此,两者之间的相对联系不会正常运作。在GitHub上,您不能使用相对链接来链接文件和目录。但是,您可以在两个文件之间进行链接(因为两个URL都包含blob)。因此,如果您想在根目录中从somefile链接回README.md,则可以执行以下操作:

[README](../README.md)

那会给你一个网址:

https://github.com/UserName/RepoName/blob/master/somedir/../README.md

将被标准化为

https://github.com/UserName/RepoName/blob/master/README.md

但是,如果您只想指向Repo(或任何其他目录)的根目录,那么最好使用完整的URL。毕竟,如果有人下载了您的仓库并且正在本地查看源,则Repo根目录的相对URL将与在GitHub上查看文件时的相对URL不同。在这种情况下,你可能想要将它们指向GitHub。因此,您应该使用:

[root](https://github.com/UserName/RepoName)

另一个优点是,如果您的文档在其他地方发布(可能是文档托管服务),该链接仍将指向GitHub仓库,而不是托管服务上的一些随机页面。毕竟,项目根目录中的自述文件不太可能包含在所述托管服务上的docs/目录的内容中。

也许这有助于理解GitHub的URL方案可能有效。我说"大概"因为我没有内部知识,只是对这些类型的系统通常如何设计的一般理解。

GitHub不提供平面文件。相反,他们的服务器将URL分开,并使用各种部分返回正确的响应。 URL结构如下所示:

https://github.com/<username>/<repository name>/<resource type>/<branch>/<resource path>

usernamerepository nameresource typebranch相当随意,只是GitHub的方法,以确保他们从正确的位置提取信息。

resource type很重要,因为它们可能无法从工作树中提取文件。相反,他们通过较低级别直接从Repo本身提取文件/目录列表。在这种情况下,获取文件与获取目录列表非常不同,并且需要不同的代码路径。因此,您无法请求带有resource path的blob(文件)指向树(目录),反之亦然。服务器感到困惑并返回错误。

关键是GitHub的服务器工作在一组略有不同的规则上。您可以使用相对网址在网址的resource path部分内移动,但是一旦更改了网址resource type部分中的resource path,就可以使用GitHub的整个方案如果您不更改网址中的resource type,则会损坏。但是,浏览器(或HTML或Markdown)对此并不了解,相对URL也不会对此进行补偿。因此,除非您了解所有细微之处,否则您无法可靠地使用相对URL在GitHub仓库中移动。有时候使用绝对链接会更好。