是否有一个返回当前项目名称的git命令?

时间:2011-11-18 23:24:01

标签: git github

git是否有内置命令来显示当前远程项目的名称?现在我正在使用它:

git remote -v | head -n1 | awk '{print $2}' | sed 's/.*\///' | sed 's/\.git//'

...但似乎会有一个内置的等价物。

11 个答案:

答案 0 :(得分:19)

我正在查找相同的信息以便自定义我的shell提示符,所以我决定尝试一下,最后输出这个命令,只输出项目的名称:

    $ git config --local remote.origin.url|sed -n 's#.*/\([^.]*\)\.git#\1#p'

如果您的远程源URL是SSH,基于DNS或基于IP的HTTPS,它应该适用于任何情况。

如果您没有远程配置,只有本地存储库和顶级文件夹是项目的名称,您可以在git树中使用git rev-parse和basename(不可靠的解决方案)。它将输出项目名称:

 TOP=$(git rev-parse --show-toplevel); echo ${TOP##*/}

注意:GH不允许您直接在HTTPS上使用IP进行克隆,因为证书链验证。这仅仅是为了说明用例。

答案 1 :(得分:13)

看起来您的脚本正在拉远程URL的最后一部分并将其用作项目名称。这在使用单个远程站点时有效,例如http://bitbucket.org,但您的系统无法在该存储库的所有用户中普遍使用。

用户通常都有不同的远程存储库,事实上在许多项目中你将拥有多个远程存储库。在获取和合并时,Git并不关心存储库的来源。合并算法甚至会接受没有共同祖先的分支。

唯一真正的解决方案是在每个存储库的根目录中创建一个包含项目名称的文本文件。无论他们如何设置遥控器,此解决方案都适用于所有用户。

答案 2 :(得分:5)

对于远程文件夹名称,它会更好

git remote -v | head -n1 | awk '{print $2}' | sed -e 's,.*:\(.*/\)\?,,' -e 's/\.git$//'

因为它可能是git@something.com:repo_name - 没有任何斜杠。

答案 3 :(得分:4)

Git中没有项目名称这样的东西。您只是远程获取存储库所在文件夹的名称。 Git没有内置的计算方法,因为它完全没有用它。

答案 4 :(得分:4)

命令git remote -v不能被认为是可靠的,因为您的存储库可以与多个远程存储库一起使用。例如,您的项目为your-project,并且您添加了another-project。在命令之后,您希望看到项目的名称,但是您将看到另一个项目的名称:

$ git remote -v | head -n1
ABC https://git.team1.ourcompany.com/another-project.git (fetch)
ABC https://git.team1.ourcompany.com/another-project.git (push)
origin https://git.ourcompany.com/your-project.git (fetch)
origin https://git.ourcompany.com/your-project.git (push)

我可以建议检查存储库的配置,例如:

$ git config --local remote.origin.url
https://git.ourcompany.com/your-project.git

在第一种方法中,这是更可靠但不提供100%保险。

答案 5 :(得分:2)

我想指出@Mike在你的问题评论中提到的相同答案,$GIT_DIR/description文件。其他一些软件将此用于存储库的名称,例如 post-receive-email挂钩脚本。 (实际上是sed -ne '1p' "$GIT_DIR/description"),因此只需使用该文件中的第一行作为存储库的名称。

答案 6 :(得分:1)

远程网址或保存git repo的文件夹可以是Git所关注的任何内容。所以你没有内置的方法来检查这个。 Git无法识别项目的名称。你必须(或项目的所有者)。通常,这将以README或类似文件的形式检入存储库,该文件提供项目的名称。

答案 7 :(得分:1)

git remote get-url origin | xargs basename -s .git

答案 8 :(得分:0)

你做得很好。我不相信有人不会在自述文件中更改名称。像你一样使用URL。决定一个约定,以便原点总是指代url将包含身份的中央仓库。

答案 9 :(得分:0)

basename $(git config remote.origin.url |sed "s/\.git$//")

答案 10 :(得分:0)

像这样被束缚的head awksed呼叫

git remote -v | head -n1 | awk '{print $2}' | sed 's/.*\///' | sed 's/\.git//'

可以像这样组合成一个sed调用:

git remote -v  | sed -rn '1s#.*/(.*)\.git.*#\1#p'