从Markdown文件的相对链接到存储库根目录

39

我需要从Markdown文件中相对于代码库的根目录创建一个链接

(需要使它适用于任何派生分支)

看起来唯一的方法是提供指向根目录下某个文件的链接:

[根目录](/README.md)

或者

[根目录](../README.md)

(例如,如果它位于/doc/README.md),同时我可以引用任何文件夹而不必引用文件本身:

[文档](/doc)

但是,如果我尝试放置到根文件夹的链接:

[真正的根目录](/)

[真正的根目录](../)

我会得到这样的链接:

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

与此不同的是:

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

引用的页面返回404错误

那么有什么办法可以创建这样的链接吗?

2个回答

49

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

[任何分支的真实相对根目录](/../../)

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

PS

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

[测试](/../../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/test) - 查找文件


2
我尝试了你提供的相对链接解决方案,但它没有起作用。我正在使用[Projects](/../../projects)在根目录下的Readme.md中链接到前端/项目。Github返回404错误。链接转换为Front-end/Projects。你的解决方案还有效吗? - DevelopZen
你可以查看这个速查表 https://github.com/sm-artlight/github-cheatsheet 并尝试它的使用方法。 - Oleg Pro
要指向名为BranchName的特定分支的根URL,您可以使用以下语法:[BranchName](/../BranchName/readme.md)。您不需要额外指定../tree。它将自动添加。 - Gangula
gogs 中,我需要使用 4 个 ../ 来切换到项目 README.md 中组织的顶级相对 URL。 - gridtrak
你的回答确实帮了我,解决了我需要的问题。 - Andre Leon Rangel

5

您可以直接链接到文件(../README.md),或者使用完整的绝对URL直接链接到仓库根目录:https://github.com/用户名/仓库名

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

那将为您提供URL:
https://github.com/UserName/RepoName/blob/master/somedir/../README.md

将被标准化为

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

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

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

另一个优点是,如果您的文档被发布到其他地方(例如文档托管服务),链接仍将指向GitHub存储库,而不是托管服务上的某个随机页面。毕竟,在您的项目根目录中的README文件不太可能包含在该托管服务的docs/目录中的内容中。
也许了解GitHub的URL方案如何工作会有所帮助。我说“可能”是因为我没有内部知识,只是对这些类型的系统通常如何设计有一般了解。
GitHub并不提供平面文件。相反,他们的服务器会拆开URL,并使用各种部分返回正确的响应。 URL结构类似于:
https://github.com/<username>/<repository name>/<resource type>/<branch>/<resource path>
用户名仓库名称资源类型分支都是任意的,只是GitHub确保它们从正确的位置获取信息的一种方式。 资源类型很重要,因为他们可能不会从工作树中获取文件。相反,他们会通过更低级别直接从Repo本身提取文件/目录列表。在这种情况下,获取文件与获取目录列表非常不同,并且需要不同的代码路径。因此,您不能使用指向树(目录)或反之的资源路径请求blob(文件)。服务器会混淆并返回错误。
重点是GitHub的服务器遵循略微不同的规则。您可以使用相对URL在资源路径的URL部分内移动,但是一旦您改变了URL中资源路径部分中的资源类型,那么如果您不在URL中同时更改资源类型,那么GitHub的整个方案就会破裂。然而,浏览器(或HTML或Markdown)对此一无所知,相对URL无法弥补这一点。因此,除非您完全了解所有细微差别,否则无法可靠地使用相对URL在GitHub repo中移动。有时候最好使用绝对链接。

2
从文件链接到文件夹没有问题。就像我的例子中可能会有[文档](/doc),它将解析为https://github.com/UserName/RepoName/blob/master/doc。也许关键是要创建一个`tree/master/somedir`类型的链接?(如何创建?)因为blob/master/到根目录不起作用。或者这是一个GitHub的问题? - Oleg Pro
“可以使用[Doc](/doc),它将被解析为github.com/UserName/RepoName/blob/master/doc。但是应该解析为github.com/UserName/RepoName/tree/master/doc。请注意,使用tree而不是blob,这就是为什么您之前报告了404错误的原因。是的,这是一个GitHub特定的问题。” - Waylan
我刚刚更新了我的答案,并且列出了GitHub URL结构的细节。或许那会帮助澄清事情。 - Waylan
感谢详细的解释,让我了解到这是不可能的 :) 但这激励了我进一步研究。问题是,如果您创建了一些具有多个嵌套级别的文档,则使用完整路径将破坏项目分支中的导航。通常,解决方案是在项目根目录中使用该文件...但最终我找到了另一个解决方案 - 它有点棘手,但它能够工作。 - Oleg Pro
2
现在treeblob会自动转到正确的位置,所以相对链接可以正常工作。如果您在blob处输入tree,它会自动更正并正常工作,反之亦然。 - Gabriel Staples
@GabrielStaples ...除了仓库的主目录(显然,所有这些也当时是真实的)。有人应该最终向他们报告。 - EvgenKo423

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接