git是否有内置命令来显示当前远程项目的名称?现在我正在使用这个:
git remote -v | head -n1 | awk '{print $2}' | sed 's/.*\///' | sed 's/\.git//'
......但似乎会有一个内置的等价物。
看起来您的脚本正在拉动远程URL的最后一部分并将其用作项目名称。这在使用单个远程站点(例如http://bitbucket.org)时有效,但您的系统不能在该存储库的所有用户中普遍使用。
用户通常都有不同的远程存储库,事实上在许多项目中你将拥有多个远程存储库。在获取和合并时,Git并不关心存储库的来源。合并算法甚至会接受没有共同祖先的分支。
唯一真正的解决方案是在包含项目名称的每个存储库的根目录中创建一个文本文件。无论他们如何设置遥控器,此解决方案都适用于所有用户。
链式head
awk
和sed
这样称呼
git remote -v | head -n1 | awk '{print $2}' | sed 's/.*\///' | sed 's/\.git//'
可以像这样组合成一个sed
调用:
git remote -v | sed -rn '1s#.*/(.*)\.git.*#\1#p'
我正在寻找相同的信息,以便自定义我的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进行克隆,因为证书链验证。这只是为了说明用例。
对于远程文件夹名称,它会更好
git remote -v | head -n1 | awk '{print $2}' | sed -e 's,.*:\(.*/\)\?,,' -e 's/\.git$//'
因为它可能是[email protected]:repo_name-没有任何斜杠。
在Git中没有项目名称这样的东西。您只是远程获取存储库所在文件夹的名称。 Git没有内置的计算方法,因为它绝对没用。
命令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%保险。
我想指出@Mike在你的问题评论中提到的相同答案,$GIT_DIR/description
文件。其他一些软件使用它作为存储库的名称,例如post-receive-email钩子脚本。 (这实际上是sed -ne '1p' "$GIT_DIR/description"
)因此只是使用该文件中的第一行作为存储库的名称。
就Git而言,远程URL或保存git repo的文件夹可以是任何东西。所以你没有内置的方法来检查这个。 Git无法识别项目的名称。你必须(或项目的所有者)。通常,这将以README或类似文件的形式检入存储库,该文件提供项目的名称。
你做的很好。我不相信有人不会在自述文件中更改名称。像你一样使用URL。确定一个约定,以便原始始终引用url将包含身份的中央仓库。
basename $(git config remote.origin.url |sed "s/\.git$//")