ghqの設定でgetの時にリポジトリのパス名が違う時にしたこと
経緯
- ローカル環境のリポジトリをghqで管理しようと思い、インストール後に
ghq get "repository"をしようとした
現象
cloneしてこようとしているrepositoryのユーザー名が違ったためcloneできない現象が起こった。
調べたこと
とりあえずどこからusernameをとってきているのだろうと思って実装を見た。
getコマンドがどのように作られているのかをみていると、以下の部分でcloneするURLを組み立てている。
https://github.com/x-motemen/ghq/blob/master/cmd_get.go#L155-L168
if len(reposFound) == 0 {
if url, err := newURL(name, false, false); err == nil {
repo, err := LocalRepositoryFromURL(url, bare)
if err != nil {
return err
}
_, err = os.Stat(repo.FullPath)
// if the directory exists
if err == nil {
reposFound = append(reposFound, repo)
}
}
}
new URL()を辿るとfillUsernameToPathが使われていて、getの時に引数のforceMeはfalseになっているので内部的にはdetectUserNameが叩かれている。
func detectUserName() (string, error) {
user, err := gitconfig.Get("ghq.user")
if (err != nil && !gitconfig.IsNotFound(err)) || user != "" {
return user, err
}
user, err = gitconfig.GitHubUser("")
if (err != nil && !gitconfig.IsNotFound(err)) || user != "" {
return user, err
}
switch runtime.GOOS {
case "windows":
user = os.Getenv("USERNAME")
default:
user = os.Getenv("USER")
}
if user == "" {
// Make the error if it does not match any pattern
return "", fmt.Errorf("failed to detect username. You can set ghq.user to your gitconfig")
}
return user, nil
}
detectUserNameの中では
ghq.userがあればそのusernameを返す(GitHub)github.usernameがあればそのusernameを返す(GitHub)- 1,2がなければ
OSのUSERとかから取得してくる
のようにしていた。
結論
- 自分の環境で調べてみたら1・2が設定されていなかったため誤ったリポジトリのパスが生成されていた。
- なので
github.usernameを設定して解決。