Markdown 文件中 Repo 根的相对 Link

Relative Link to Repo's Root from Markdown file

我需要有一个亲戚 link 到我的 markdown 文件

的 repo 的根目录

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

所以它看起来是向根目录中的某个文件提供link的唯一方法:

the [Root](/README.md)

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

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

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

the [Doc](/doc)

但是如果我尝试将 link 放入根文件夹:

the [real root](/)

the [real root](../)

我要一个link这样的

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

这与

不同

https://github.com/UserName/RepoName/blob/master/doc

指404

因此,如果我不想在根目录中引用 README.md(我可能根本没有)

有什么办法可以有这样的link?

您可以 link 直接访问文件 (../README.md),或者直接使用完整的绝对 URL 到 link 直接访问 repo 根目录:https://github.com/UserName/RepoName

使用相对 links 在 GitHub 上效果不佳。请注意以下两个 URL 之间的区别:

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

注意第一个指向一个目录,第二个指向一个文件。然而,在 "RepoName" 之后,我们有 tree(目录)或 blob(文件)之一。因此两者之间的相对 links 将无法正常工作。在 GitHub 上,您不能在文件和目录之间使用相对 link 到 link。但是,您可以在两个文件之间 link(因为两个 URL 都包含 blob)。因此,如果你想 link 从 somefile 回到根目录中的 README.md,你可以这样做:

[README](../README.md)

那会给你 URL:

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

这将被标准化为

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

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

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

这样做的另一个好处是,如果您的文档在其他地方发布(可能是文档托管服务),link 仍将指向 GitHub 存储库,而不是托管服务。毕竟,您项目根目录下的自述文件不太可能包含在上述托管服务的 docs/ 目录中。


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

GitHub 未提供平面文件。相反,他们的服务器将 URL 分开,并使用不同的部分来 return 正确的响应。 URL 结构看起来像这样:

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

usernamerepository nameresource typebranch 相当随意,只是 GitHub 确保它们从正确的位置。

resource type 很重要,因为它们可能不会从工作树中提取文件。相反,他们通过较低级别直接从 Repo 本身拉取 files/directory 列表。在那种情况下,获取文件与获取目录列表非常不同,并且需要不同的代码路径。因此,您不能请求带有指向树(目录)的 resource path 的 blob(文件),反之亦然。服务器变得混乱并且 return 出现错误。

重点是 GitHub 的服务器在一组略有不同的规则上工作。您可以使用相对 URLs 在 URL 的 resource path 部分内移动,但是一旦您更改 resource path 部分中的 resource type URL,如果你不同时更改 URL 中的 resource type,那么 GitHub 的整个方案就被打破了。但是,浏览器(或 HTML 或 Markdown)对此一无所知,并且相关的 URL 不会对此进行补偿。因此,您不能可靠地使用相对 URLs 在 GitHub 存储库中移动,除非您了解所有的细微之处。有时最好使用绝对 links.

经过一番研究,我找到了这个解决方案:

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

它总是指向默认分支。对我来说没关系,所以这取决于你

PS

通过这样的技巧,您还可以获得以下能力:

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

[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) - 查找文件