如何在Git中通过URL自动切换电子邮件地址?

时间:2019-05-13 12:43:53

标签: git

我的大多数Git回购都可以归类为github回购或公司回购,两者都有相当数量。显然,对于这两种不同的存储库,我需要使用不同的电子邮件地址。

我阅读了git manual并进行了大量搜索,发现只有两种方法可以配置用户电子邮件:全局和按回购。

因此,如果我想为这两种存储库使用不同的电子邮件地址,则有两种选择:

  1. 将全局电子邮件地址设置为其中之一,并仔细设置其他存储库的每个回购电子邮件地址。
  2. 始终按回购设置电子邮件地址,并通过git config --global user.useConfigOnly true强制输入

都不令人满意:(

理想的解决方案可能看起来像url.insteadOf

[url "https://github"]
  insteadOf = git://github
  user_email = xxx@gmail.com

那么这种情况有什么解决办法吗?也许通过git hook或其他魔术?

注意:我的问题与this one完全不同,因为我需要自动切换,而不仅是逐个添加每个存储库配置。

2 个答案:

答案 0 :(得分:1)

我不得不处理同样的问题,并找到了一种棘手的方法。小心使用。

所有技巧都与此命令有关:HOME=$var git <anything>

HOME=$var切换命令的主目录。默认情况下,Git查找~/.gitconfig,因此控制$HOME就是控制~/.gitconfig

此外,Git配置文件允许包含其他Git配置文件,以“导入”它:

[include]
    path = /path/to/.gitconfig

这意味着您可以使用别名和默认电子邮件设置“ 默认~/.gitconfig,并添加“ 级别~/foo/.gitconfig,{{ 1}}等,并管理“ 依赖项”。


这是我的脚本,请参阅recursive-gitconfig repository,但是出于SO的缘故,我更喜欢在此处添加它。

~/foo/bar/.gitconfig

它基本上找到了从<{1}降到# Look for closest .gitconfig file in parent directories # This file will be used as main .gitconfig file. function __recursive_gitconfig_git { gitconfig_file=$(__recursive_gitconfig_closest) if [ "$gitconfig_file" != '' ]; then home="$(dirname $gitconfig_file)/" HOME=$home "$(which git)" "$@" else "$(which git)" "$@" fi } # Look for closest .gitconfig file in parents directories function __recursive_gitconfig_closest { slashes=${PWD//[^\/]/} directory="$PWD" for (( n=${#slashes}; n>0; --n )) do test -e "$directory/.gitconfig" && echo "$directory/.gitconfig" && return directory="$directory/.." done } alias git='__recursive_gitconfig_git' 的“ 最近” Git配置文件,并将./设置为其目录。

更多文档here


有了它,您应该能够根据您当前所在的位置来管理多个身份,ssh密钥等,因此,取决于您正在处理的存储库。

答案 1 :(得分:0)

名为 Conditional Includes 的新git功能(来自git 2.13)是关键。以下是我的解决方案:


import {NgModule} from '@angular/core';
import {
  MatAutocompleteModule,
  MatBadgeModule,
  MatBottomSheetModule,
  MatButtonModule,
  MatButtonToggleModule,
  MatCardModule,
  MatCheckboxModule,
  MatGridListModule,
  MatIconModule,
  MatInputModule,
  MatListModule,
  MatMenuModule,
  MatTableDataSource,
  MatPaginatorModule,
  MatRadioModule,
  MatTableModule,
  MatPaginator,
} from '@angular/material';

@NgModule({
  exports: [
  MatAutocompleteModule,
  MatBadgeModule,
  MatBottomSheetModule,
  MatButtonModule,
  MatButtonToggleModule,
  MatCardModule,
  MatCheckboxModule,
  MatGridListModule,
  MatIconModule,
  MatInputModule,
  MatListModule,
  MatMenuModule,
  MatTableDataSource,
  MatPaginatorModule,
  MatRadioModule,
  MatTableModule,
  MatPaginator,
  ]
})
export class MaterialModule {}


此解决方案并不严格遵循我的要求(通过远程来源的repo url自动切换),但是如果您将存储库克隆到其他根目录中,则可以很好地发挥作用。

如果要强迫自己在回购根目录之外设置电子邮件,则只需在全局配置中设置$ cat ~/.gitconfig | head -5 [includeIf "gitdir:~/gh/**"] path = ~/.github.gitconfig [includeIf "gitdir:~/work/**"] path = ~/.work.gitconfig $ cat ~/.github.gitconfig [user] name = MyName email = my-personal-emal@gmail.com $ cat ~/.work.gitconfig [user] name = MyName email = my-company-email@company.com [init] templatedir = ~/work/.gittemplates ,然后在条件包含的文件中将它们覆盖为useConfigOnly = true

>

希望这可以为您提供帮助:)