@@ -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: エラーが発生した場合はエラーオブジェクト
199282func launchVSCode () error {
200283 codeCmd := exec .Command ("code" , "." )
201284 codeCmd .Stdout = os .Stdout
0 commit comments