既存のフォルダーに「git clone」するためのベストプラクティスは何ですか?


480

プロジェクトの作業用コピーがあり、ソース管理メタデータがありません。ここで、このフォルダーにgit-cloneと同等の操作を行い、ローカルの変更を保持します。

git-cloneでは、既存のフォルダーにクローンを作成できません。ここでのベストプラクティスは何ですか?


4
より良い議論がここにあります
cdunn2001 2013年

1
@MEM私はこの回答の方が好きですが、どちらでも機能します... stackoverflow.com/a/5377989/11236
ripper234

2
@ ripper234-はい。私も同じ状況で、これらの手順を実行しただけで問題はありませんでした。すべてきれいでいい。あなたが述べているように、どちらも機能するのは好みの問題だと思います。乾杯。
MEM

1
これは非常にクレイジーであり、実現するための明確な方法がないため、マウントされた共有フォルダにプロジェクトを複製する場合に便利です。
Thomas Decaux

回答:


559

これは、新しいディレクトリにクローンを作成し、その.gitディレクトリを既存のディレクトリに移動することで実行できます。

既存のディレクトリの名前が「コード」の場合。

git clone https://myrepo.com/git.git temp
mv temp/.git code/.git
rm -rf temp

これは、cloneコマンドの実行中にチェックアウトを行わなくても実行できます。詳細については、こちらをご覧ください


25
これは、彼がコメントに残した@ChrisJohnsenからの提案であることに注意してください。私はそれが役に立ったと思って、それを実際の答えにしたいと思いました。クリス、答えを出してしまったら、喜んでこれを削除します。
amicitas 2012

2
ありがとう!これには「git checkout-」のようなステップがありませんが。すべてのファイルが削除されたと思うので、そうですか?
mrooney

2
いいえ、git clone最初のコマンドとして使用する限り、それ以上のチェックアウトコマンドは必要ありません。代わりgit clone --no-checkoutにその最初のステップのようなものを使用する場合、.gitディレクトリが移動した後git reset HEAD、ファイルが削除されていないことをgitに通知するために使用する必要があります。
amicitas 2013年

3
これを3番目のステップとして追加します。mvtemp / .gitignore code / .gitignore
Daniel Aranda

1
@KalpeshSoni、はいgitは変更されたファイルについて知っているので、などの通常のgitコマンドを使用して変更を確認することができますgit status
amicitas

284

クローンを作成せず、代わりにフェッチしてください。リポジトリでは:

git init
git remote add origin $url_of_clone_source
git fetch origin
git checkout -b master --track origin/master # origin/master is clone's default

次に、ツリーをリセットして、必要なコミットを取得できます。

git reset origin/master # or whatever commit you think is proper...

クローンしたようなものです。

ここで興味深い質問(および答えのない質問):裸のツリーがどのコミットに基づいているか、つまりどの位置にリセットするかを知る方法。


7
私はこれのファンではありません-GitHubセットアップごとに「ヒント:クレデンシャルヘルパーは、HTTPSリポジトリURLのクローンを作成するときにのみ機能します。」私はクレデンシャルヘルパーを使用していたため、かなり実りのない長いウサギの穴に追い込まれました。
Andrew

5
「git checkout --track origin / master」の代わりに「git checkout --track origin / master」も適切に機能します。リセットは必要ありません。
felipecrp 2014

1
「Gitエラー:次の追跡されていない作業ツリーファイルはチェックアウトによって上書きされます」というエラーが発生したため、次のコマンドを追加します:git clean -d -fx ""
shakaran

1
すべての状況で推奨されるわけではありませんが、これがまさに私が必要としていたことです。
Chaim Eliyah

1
@AndreasKrey元の回答(私が編集履歴を参照して確認しました)は、質問(および私)が必要とするものを正確に実行します。-fを使用せずにチェックアウト時に変更された回答barfsは、ローカルの変更を破棄し、まさに私望まないものです。私があなただったら、元の答えにロールバックすることを検討します。
アジャン

77

次のようにして、既存のディレクトリのマスターブランチをチェックアウトしました。

git init
git remote add origin [my-repo]
git fetch
git checkout origin/master -ft

2
これは素晴らしい答えであり、ファイルシステムの細工を避けます。
user151841 2017

1
これはハックではないので、これは受け入れられる答えになるはずです。
php_nub_qq 2018

5
実際、これはOP(および私)望まないことを正確に実行します。つまり、ローカルの変更を上書きします。
Ajean

私の賛成票は、これが私を助けたということを示しています。それがOPの質問に対する最良の答えではありません。
TecBrat 2018

2
-tここでフラグが使用されている理由を誰かが説明できますか?
jfowkes

38

私がいただきたいgit clone新しいディレクトリにして、新しいクローンに既存のディレクトリの内容をコピーします。


4
その場合は、十分に慎重にコミットする前に差分を確認してください。これは、作業コピーを取得するたびにソースリポジトリで行われた変更を誤って元に戻すことができる絶対的な古典的なケースです-十分な情報がないためです。作業コピーで、自分が行った変更と、変更を始める前の状態を把握し、リポジトリで行われた他の変更とマージします。私は、この状況で何度も何度もこのような状況が発生するのを目にしてきましたが、自分自身と一緒に働いていた人々にこれまでやったことがないように「強く落胆」しました。
ベンクリフォード

72
git clone wherever tmp && git mv tmp/.git . && rm -rf tmpつまり、.git一時的なクローンからディレクトリを移動する方が、クローンの作業ツリーをクリーンアップして既存のファイルをそこにコピーするよりも簡単に見えます。
Chris Johnsen、2011年

1
@ChrisJohnsen:あなたはそれを答えにするべきだった、それが間違いなくそれを行うには最良の方法だ
Stefano

2
@ChrisJohnsen git mv tmp/.git .が戻っfatal: cannot move directory over file, source=tmp/.git, destination=.gitてきました。誰が問題が何であるか知っていますか?
Dennis

6
@Dennis、それはタイプミスです:そのコマンドは単純mvではなくgit mv、ただし、.gitファイルが既に存在する理由は説明されていません(gitdir: some/path/to/a/git-dir「gitfile」が含まれています。存在しない場合は、fatal: Not a git repository (or any of the parent directories): .git代わりに表示されます)。
Chris Johnsen、2012年

34

一時ディレクトリの使用は問題ありませんが、そのステップを回避したい場合はこれでうまくいきます。作業ディレクトリのルートから:

$ rm -fr .git
$ git init
$ git remote add origin your-git-url
$ git fetch
$ git reset --mixed origin/master

20
git reset --hard origin/masterローカルファイルを削除します。
Mouad Debbar 2013年

1
すでに上記で指摘しているものに違いを追加するhardと、mixed混合ローカルの変更を保つことである(後で、それはあなたの例を紹介します引っ張ってみてくださいもしそうなら:あなたはunstaged変更がコミットまたはそれらを隠してくださいリベースを引くことはできません。) 、ハードはこれらのローカルな変更を破棄します
aexl 2017年

リモートのスペルを間違えた。
グレンデイトン

10
git clone your_repo tmp && mv tmp/.git . && rm -rf tmp && git reset --mixed

7
を使用git reset --hardすると、ローカルファイルの変更、特にこのOPが要求したものではありません。--mixed代わりに使用する必要があります。
カレブ

4

git repoを空の既存のディレクトリに複製するには、次のようにします。

cd myfolder
git clone https://myrepo.com/git.git . 

コマンド.の最後にがあることに注意してくださいgit clone。これにより、リポジトリが現在の作業ディレクトリにダウンロードされます。


4
fatal: destination path '.' already exists and is not an empty directory.
Roland Kofler 2017

ディレクトリは空でなければなりません。
okTalk

4
OPは、既存のプロジェクトにクローンを作成する方法を求めており、git cloneが文句を言う。悪い答え。
mix3d

これは、新しいディレクトリを作成する場合にのみ機能し、「git init」を使用せずに上記のコマンドを実行します
Bilal Ahmed

3

OPが要求した方法でこれを行うには、すでにたくさんの答えがあります。ただし、反対の方法で行う方がはるかに簡単であることは注目に値します。

git clone repo-url tmp/
cp -R working/ tmp/

これで、目的のターゲット状態(新鮮なクローン+ローカル変更)が得られました。


2

これには2つの方法があります。可能であれば、新しいgit作業ディレクトリ用のクリーンなフォルダから始めて、後でバージョンをコピーします。これは次のようになります*:

mv $dir $dir.orig
git clone $url $dir
rsync -av --delete --exclude '.git' $dir.orig/ $dir/
rm -rf $dir.orig

この時点で、以前の作業フォルダを現在の作業ディレクトリとしてかなりクリーンな作業コピーが作成されているはずですgit status。実行すると、ファイルの削除を含む変更がレーダーに表示されます。

一方、実際に逆に行う必要がある場合は、次のようなもので同じ結果を得ることができます。

cd $dir
git clone --no-checkout $url tempdir
mv tempdir/.git .
rmdir tempdir
git reset --mixed HEAD

どちらの方法でも、最初に行うことはgit stash、ローカルのすべての変更のコピーを脇に置いておき、それらを再適用して、コミットしたい変更を処理することです。

* どちらの例も、プロジェクトの親ディレクトリのシェルから始めることを前提としています。


2

これは私が出会ったすべての方法の中で最高です

リポジトリの.gitフォルダー(既に存在するファイルを除くexisting-dir)のみを空の一時ディレクトリに複製します。

  1. git clone --no-checkout repo-path-to-clone existing-dir/existing-dir.tmp //ローカルリポジトリを複製するための--no-hardlinksが必要な場合があります

.gitフォルダーをファイルのあるディレクトリに移動します。これはexisting-dirgitリポジトリになります。

  1. mv existing-dir/existing-dir.tmp/.git existing-dir/

一時ディレクトリを削除します

  1. rmdir existing-dir/existing-dir.tmp

  2. cd existing-dir

Gitはすべてのファイルが削除されたと見なし、これによりリポジトリの状態がHEADに戻ります。

警告:ファイルに対するローカルの変更はすべて失われます。

  1. git reset --mixed HEAD

1
ハードリセットは、これを実行する必要がある場合の99%で望ましくないようです。
Stefan Fabian

0

少なくともgit 1.7.7(オプションを教えclone--config)を使用している場合、現在のディレクトリを作業コピーにするには:

git clone example.com/my.git ./.git --mirror --config core.bare=false

これは以下によって機能します:

  • リポジトリを新しい.gitフォルダに複製する
  • --mirror.git必要に応じて、新しいクローンを純粋なメタデータフォルダーに作成します
  • --config core.bare=false暗黙のcountermands bare=true--mirrorそれによって、リポジトリが関連付けられている作業ディレクトリを持っており、通常のクローンのように行動することができ、オプション

.git作業コピーにしたいディレクトリにメタデータディレクトリが既に存在する場合、これは明らかに機能しません。


1
この技術はもたらすことに注意[core]の両方を含むローカル設定のセクションbare = true bare = false。さらに問題なのは、originリモートに対して間違った値が[remote "origin"]含まれ、セクションが含まれていることmirror = true、およびフェッチ仕様が作業コピーでは正しく機能しないことです。これらの問題を修正した後は、通常のクローン作成と新しい作業コピーの移動.gitがより効率的になります。
Araxia 2014

0

通常、最初に最初のリポジトリを複製してから、既存のフォルダ内のすべてを最初のリポジトリに移動します。それは毎回機能します。

この方法の利点は、READMEや.gitignoreを含め、初期リポジトリの何も欠落しないことです。

以下のコマンドを使用して、手順を完了することもできます。

$ git clone https://github.com/your_repo.git && mv existing_folder/* your_repo

0

これを行うには、次のコマンドラインを再帰的に入力します。

mkdir temp_dir   //  Create new temporary dicetory named temp_dir
git clone https://www...........git temp_dir // Clone your git repo inside it
mv temp_dir/* existing_dir // Move the recently cloned repo content from the temp_dir to your existing_dir
rm -rf temp_dir // Remove the created temporary directory

0

だけを使用してください。git cloneコマンドの最後(そのディレクトリにある)で、次のように:

cd your_dir_to_clone_in/
git clone git@github.com/somerepo/ .
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.