Skip to content

Commit e5df193

Browse files
committed
feat: GitHubリポジトリ作成コマンドにmainブランチの作成とデフォルトブランチ設定機能を追加
1 parent 2494489 commit e5df193

File tree

1 file changed

+90
-7
lines changed

1 file changed

+90
-7
lines changed

cmd/repo/create_repository.go

Lines changed: 90 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ Package repo は git の拡張コマンドのうち、リポジトリ関連の
88
- GitHub リポジトリの作成(public/private 選択可能)
99
- リポジトリの説明文の設定
1010
- 作成したリポジトリのクローン
11+
- main ブランチの作成とデフォルトブランチへの設定
1112
- VSCode の自動起動
1213
1314
使用例:
@@ -37,7 +38,9 @@ var createRepositoryCmd = &cobra.Command{
3738
1. GitHubにリモートリポジトリを作成(public/private選択可能、Description指定可能)
3839
2. 作成したリポジトリをクローン
3940
3. クローンしたディレクトリに移動
40-
4. VSCodeでプロジェクトを開く`,
41+
4. mainブランチを作成し初期コミットを実行
42+
5. mainブランチをリモートにプッシュしデフォルトブランチに設定
43+
6. VSCodeでプロジェクトを開く`,
4144
Example: ` git create-repository my-new-project`,
4245
Args: cobra.ExactArgs(1),
4346
RunE: func(cmd *cobra.Command, args []string) error {
@@ -61,31 +64,45 @@ var createRepositoryCmd = &cobra.Command{
6164
}
6265

6366
// Step 1: GitHubリポジトリを作成
64-
fmt.Println("\n[1/4] GitHubにリポジトリを作成しています...")
67+
fmt.Println("\n[1/6] GitHubにリポジトリを作成しています...")
6568
repoURL, err := createGitHubRepository(repoName, visibility, description)
6669
if err != nil {
6770
return fmt.Errorf("リポジトリの作成に失敗しました: %w", err)
6871
}
6972
fmt.Printf("✓ リポジトリを作成しました: %s\n", repoURL)
7073

7174
// Step 2: リポジトリをクローン
72-
fmt.Println("\n[2/4] リポジトリをクローンしています...")
75+
fmt.Println("\n[2/6] リポジトリをクローンしています...")
7376
if err := cloneRepo(repoURL); err != nil {
7477
return fmt.Errorf("クローンに失敗しました: %w", err)
7578
}
7679
fmt.Println("✓ リポジトリをクローンしました")
7780

7881
// Step 3: クローンしたディレクトリに移動
79-
fmt.Println("\n[3/4] ディレクトリに移動しています...")
82+
fmt.Println("\n[3/6] ディレクトリに移動しています...")
8083
cloneDir := filepath.Join(".", repoName)
8184
if err := os.Chdir(cloneDir); err != nil {
8285
return fmt.Errorf("ディレクトリの移動に失敗しました: %w", err)
8386
}
8487
currentDir, _ := os.Getwd()
8588
fmt.Printf("✓ ディレクトリに移動しました: %s\n", currentDir)
8689

87-
// Step 4: VSCodeを開く
88-
fmt.Println("\n[4/4] VSCodeを開いています...")
90+
// Step 4: mainブランチを作成し初期コミットを実行
91+
fmt.Println("\n[4/6] mainブランチを作成し初期コミットを実行しています...")
92+
if err := createInitialCommit(repoName); err != nil {
93+
return fmt.Errorf("初期コミットの作成に失敗しました: %w", err)
94+
}
95+
fmt.Println("✓ mainブランチを作成し初期コミットを実行しました")
96+
97+
// Step 5: mainブランチをリモートにプッシュしデフォルトブランチに設定
98+
fmt.Println("\n[5/6] mainブランチをリモートにプッシュしています...")
99+
if err := pushAndSetDefaultBranch(repoName); err != nil {
100+
return fmt.Errorf("mainブランチのプッシュに失敗しました: %w", err)
101+
}
102+
fmt.Println("✓ mainブランチをリモートにプッシュしデフォルトブランチに設定しました")
103+
104+
// Step 6: VSCodeを開く
105+
fmt.Println("\n[6/6] VSCodeを開いています...")
89106
if err := launchVSCode(); err != nil {
90107
fmt.Printf("警告: VSCodeの起動に失敗しました: %v\n", err)
91108
fmt.Println("手動で 'code .' を実行してください。")
@@ -192,10 +209,76 @@ func cloneRepo(repoURL string) error {
192209
return gitCmd.Run()
193210
}
194211

212+
// createInitialCommit は main ブランチを作成し、README.md を含む初期コミットを実行します。
213+
//
214+
// パラメータ:
215+
//
216+
// repoName: リポジトリ名(README に使用)
217+
//
218+
// 戻り値:
219+
//
220+
// error: エラーが発生した場合はエラーオブジェクト
221+
func createInitialCommit(repoName string) error {
222+
// main ブランチを作成
223+
checkoutCmd := exec.Command("git", "checkout", "-b", "main")
224+
if output, err := checkoutCmd.CombinedOutput(); err != nil {
225+
return fmt.Errorf("mainブランチの作成に失敗しました: %v: %s", err, string(output))
226+
}
227+
228+
// README.md を作成
229+
readmeContent := fmt.Sprintf("# %s\n", repoName)
230+
if err := os.WriteFile("README.md", []byte(readmeContent), 0644); err != nil {
231+
return fmt.Errorf("README.mdの作成に失敗しました: %w", err)
232+
}
233+
234+
// README.md をステージング
235+
addCmd := exec.Command("git", "add", "README.md")
236+
if output, err := addCmd.CombinedOutput(); err != nil {
237+
return fmt.Errorf("ファイルのステージングに失敗しました: %v: %s", err, string(output))
238+
}
239+
240+
// 初期コミットを実行
241+
commitCmd := exec.Command("git", "commit", "-m", "Initial commit")
242+
if output, err := commitCmd.CombinedOutput(); err != nil {
243+
return fmt.Errorf("初期コミットに失敗しました: %v: %s", err, string(output))
244+
}
245+
246+
return nil
247+
}
248+
249+
// pushAndSetDefaultBranch は main ブランチをリモートにプッシュし、
250+
// GitHub でデフォルトブランチとして設定します。
251+
//
252+
// パラメータ:
253+
//
254+
// repoName: リポジトリ名
255+
//
256+
// 戻り値:
257+
//
258+
// error: エラーが発生した場合はエラーオブジェクト
259+
func pushAndSetDefaultBranch(repoName string) error {
260+
// main ブランチをリモートにプッシュ
261+
pushCmd := exec.Command("git", "push", "-u", "origin", "main")
262+
pushCmd.Stdout = os.Stdout
263+
pushCmd.Stderr = os.Stderr
264+
if err := pushCmd.Run(); err != nil {
265+
return fmt.Errorf("mainブランチのプッシュに失敗しました: %w", err)
266+
}
267+
268+
// GitHub でデフォルトブランチを main に設定
269+
ghCmd := exec.Command("gh", "repo", "edit", "--default-branch", "main")
270+
if output, err := ghCmd.CombinedOutput(); err != nil {
271+
return fmt.Errorf("デフォルトブランチの設定に失敗しました: %v: %s", err, string(output))
272+
}
273+
274+
return nil
275+
}
276+
195277
// launchVSCode は現在のディレクトリで VSCode を起動します。
196278
//
197279
// 戻り値:
198-
// error: エラーが発生した場合はエラーオブジェクト
280+
//
281+
// error: エラーが発生した場合はエラーオブジェクト
199282
func launchVSCode() error {
200283
codeCmd := exec.Command("code", ".")
201284
codeCmd.Stdout = os.Stdout

0 commit comments

Comments
 (0)