0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GitHubで初心者がcloneした結果リポジトリが空になった

Last updated at Posted at 2022-05-21

問題の概要

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 するところを勉強する必要があると思いました。

参考サイト

【Git初心者向け】リポジトリの作成からpushまでを解説

Git Guide - Git remote

リポジトリのcloneとforkの違い

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?