問題の概要
GitHubアカウントを作り、新規でローカルでコミットしたテキストファイルを自分のリモートリポジトリにプッシュした。次にこれをcloneしてローカルで編集しようとしたが、そのcloneを実行するとローカルに上記のテキストファイルがダウンロードされなかった。
環境
git version 2.25.1
AWS EC2のUbuntu Server 20.04 LTS
# Local
/usr/local/src/
|___ github/pushtest/
| |___ pushtest.text
|
pushtest
がローカルリポジトリ。その下にプッシュしたテキストファイルがある。
仮説:リモートリポジトリと違う名前をローカルリポジトリに付けたからcloneできていない
いろいろGitHubのマニュアルやらを調べたのですが、原因がよく分かりませんでした。
ここでふと気づいたことがありました。リモートリポジトリの名前は hello
ですが、ローカルは pushtest
となっています。この違いに何か問題があるかもしれません。参考にしていたサイトではリモートもローカルも pushtest
というリポジトリ名でした。
clone元のリポジトリ名がローカルと違うと、正しく紐づかない?
上記の仮説が根本要因だとした時、少し原因を掘り下げます。
GitHubの ドキュメントでremote
コマンドについての説明を読んでいてふと思ったのが、「名前が違う2つのリポジトリ同士がうまく紐づいていないのでは?」ということです。
ドキュメントによると、
remote
コマンドは、ローカルリポジトリで追跡しているリモートのセットを管理します。remote add
で「リモートを追加」します。この時に、pushしたいリポジトリをうまくリモート側と紐づけられていなかったのではないかと思いました。
ここで思い浮かんだのが、clone元のリモートリポジトリ hello
に対して、
(1)プッシュ元のローカルリポジトリ pushtest
はリンクされているが、
(2)clone先のローカルリポジトリ pushtest/hello
はリンクしていない。
# Remote (マスターブランチ)
/ユーザーID/hello
|___ pushtest.text
|
# Local
/usr/local/src/
|___ github/pushtest/※(1)pushを実行した時のカレントディレクトリ=リンクされている?
| |___ hello/ ※(2)cloneを実行した結果できたディレクトリ=リンクされていない?
| | |___ [空] ※問題の部分
| |
| |___ pushtest.text
上記「(1)clone元のリモートリポジトリに対してローカルリポジトリはリンクされている」について status -v
コマンドで確かめてみました。
status
コマンドは、現在のローカルブランチがリモートブランチにリンクされていれば、リモートよりバージョンが遅れているか進んでいるかを返してくれるコマンドです。
:/usr/local/src/github/pushtest$ sudo git status -v
On branch master
Untracked files:
...
マスターブランチ上で追跡されていないファイルがあります:
と表示されました。
上記の「(1)clone元のリモートリポジトリに対してローカルリポジトリはリンクされている」
という仮説は見当違いっぽいです。
名前が違っているため、リモートリポジトリ hello
とプッシュ元のローカルリポジトリpushtest
はリンクされていないということでしょうか?
これを確認するために、リモートリポジトリとローカルリポジトリも同じtest2
という名前でやってみます。
ローカルとリモートで同じリポジトリ名を付けてgit init、commit、pushまで行う
test2
というローカルリポジトリからtest2.txt
をpushします。
ubuntu@xyz:/usr/local/src/github/test2$ sudo git init
Initialized empty Git repository in /usr/local/src/github/test2/.git/
ubuntu@xyz:/usr/local/src/github/test2$ sudo vi test2.txt
ubuntu@xyz:/usr/local/src/github/test2$ sudo git add test2.txt
ubuntu@xyz:/usr/local/src/github/test2$ sudo git status -v
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: test2.txt
diff --git a/test2.txt b/test2.txt
new file mode 100644
index 0000000..a8b76de
--- /dev/null
+++ b/test2.txt
@@ -0,0 +1 @@
+test2!
ubuntu@xyz:/usr/local/src/github/test2$ sudo git commit -m "pushコマンドのtest2"
...
......
Your name and email address were configured automatically ......
...
ubuntu@xyz:/usr/local/src/github/test2$ sudo git remote add origin https://github.com/kononzio/test2.git
ubuntu@xyz:/usr/local/src/github/test2$ sudo git status -v
On branch master
nothing to commit, working tree clean
ubuntu@xyz:/usr/local/src/github/test2$ sudo git push origin master
Username for 'https://github.com': kononzio
Password for 'https://kononzio@github.com':
......
* [new branch] master -> master
気付いたこと(1):ローカルリポジトリでgit status した時の応答の違い
今回問題を考えるためにローカルとリモートでリポジトリを同じ名前にした結果、git status
の実行結果が変わりました。
問題となっていた、異なるリポジトリ名にremote add
したディレクトリでは、git status
の結果は マスターブランチ上で追跡されていないファイルがあります:
でした。
今回は マスターブランチ上でコミットするものはありません。稼働しているツリーはクリーンです
という問題なさげなメッセージとなっていました。やはりローカルとリモートに異なるリポジトリ名を付けていたのが原因だったのかもしれません。
気付いたこと(2):そもそもローカルリポジトリからpushしてcloneする意味がない
良く考えたら、ローカルリポジトリからpushしただけでは、そのファイルにはリモート上では何も変更は起きないですね。それをそのままcloneしても意味がないということに気付きました。
# Remote (マスターブランチ)
/ユーザーID/test2
|___ test2.text ※今回pushされたファイル
|
# Local
/usr/local/src/
|_github/test2/
| |___ test2.text ※ここにcloneしてもファイル内容は変わらない
|
他者のリポジトリに貢献する前提でcloneがあるのかも
今回cloneを理解するうえでリポジトリのcloneとforkの違いという記事が参考になったのですが、cloneを行う場面って、自分以外の人が修正した部分を、自分のローカルに反映させたい時なんじゃないかと感じました。「いろんな人が自分以外のリポジトリにプルリクエストを送り、それがマージされるから自分が修正したのとは違う部分に変更が生まれる。それをcloneでローカルにダウンロードする。」という言い方もできるかもしれません。
次に勉強すること
実際に気になるリポジトリからforkして、clone するところを勉強する必要があると思いました。