空でないディレクトリにクローンするにはどうすればよいですか?


573

私はディレクトリBに一致するファイルを含むディレクトリAを持っています。ディレクトリAには他の必要なファイルがある可能性があります。ディレクトリBはgitリポジトリです。

ディレクトリBをディレクトリAに複製したいのですが、ディレクトリが空ではないので、git-cloneでは許可されません。

私はそれが.gitを複製することを望んでいました、そしてすべてのファイルが一致するのでそこから行くことができますか?

空のディレクトリにクローンを作成できません。ディレクトリBにないファイルがディレクトリAにあり、それらを保持したいのです。

.gitのコピーはオプションではありません。参照でプッシュ/プルを行い、手動で設定したくないからです。

これを行う方法はありますか?

更新:これはうまくいくと思いますが、誰か問題がありますか?->

cd a
git clone --no-hardlinks --no-checkout ../b a.tmp 
mv a.tmp/.git .
rm -rf a.tmp
git unstage # apparently git thinks all the files are deleted if you don't do this

5
おそらくあなたは受け入れられた答えを変えることができますか?
バスティアンクアスト

回答:


724

これは私のために働きました:

git init
git remote add origin PATH/TO/REPO
git fetch
git reset origin/master  # Required when the versioned files existed in path before "git init" of this repo.
git checkout -t origin/master

注: -t必要に応じて、通常はアップストリームブランチを設定します。


70
(元の質問で説明されているように)着信ファイルが既に存在する場合、これは空でないディレクトリでは機能しません。ただし、のgit reset origin/master後に実行するとgit fetch、機能します(ローカルの変更も保持されます)。
Araxia 2014

8
致命的:パスを更新すると同時にブランチ「マスター」に切り替えることはできません。
アーノルドロア2015

7
この答えは私にはうまくいきません。私がgit checkout ...git を実行すると、すべてのファイルが上書きされ、最初にそれらを移動する必要があると不平を言われます。`git reset origin / master /`を最初に実行すると、checkoutコマンドはmasterという名前のブランチが既に存在することを報告します。
2016年

4
git checkout master私にとっては十分な最終ステップでした。
ヨーヨー

16
すべてのステップは完璧に機能しましたが、最後のステップで私は得られましたfatal: A branch named 'master' already exists。本当に必要なかったと思います。
Shadi、2017年

164

次のシェルコマンドにexisting-dirは、内容がrepo-to-clonegitリポジトリ内の追跡対象ファイルと一致するディレクトリがあります。

# Clone just the repository's .git folder (excluding files as they are already in
# `existing-dir`) into an empty temporary directory
git clone --no-checkout repo-to-clone existing-dir/existing-dir.tmp # might want --no-hardlinks for cloning local repo

# Move the .git folder to the directory with the files.
# This makes `existing-dir` a git repo.
mv existing-dir/existing-dir.tmp/.git existing-dir/

# Delete the temporary directory
rmdir existing-dir/existing-dir.tmp
cd existing-dir

# git thinks all files are deleted, this reverts the state of the repo to HEAD.
# WARNING: any local changes to the files will be lost.
git reset --hard HEAD

5
私がする必要があった、git reset --hard HEADまたはそれは「削除された」ファイルをあきらめなかったでしょう。
Dimitar 2011

18
git reset HEAD私にとってはうまくいきました。git reset --hard HEADファイル内のすべての変更を破棄するため、それらがリポジトリ内のファイルと完全に同じでない場合は、それを行わないでください。
Tgr

1
git reset HEAD私には何の影響もないようです。git reset --hard HEADしますが、ファイルに加えた変更はすべて失われます。より良い解決策はありますか?
Jacob Dorman、

1
@Caseyの答え-git init / remote add / fetch / checkout-はより簡潔でシンプルで、一時フォルダーを必要としません。
ヨーヨー2014

1
@Caseyの回答は、フォルダーにファイルを残しておく必要があるが、gitリポジトリにはない場合は機能しませんでした。これは、ファイルとディレクトリが作成されているがインストールされたアイテムの上にファイルを更新/追加する必要があるインストールスクリプトを実行した後に設定を更新するのに役立ちます。
ソウルストン2014

104

私のために働いた答えの1つを少し修正しました:

git init
git remote add origin PATH/TO/REPO
git pull origin master

すぐにマスターブランチの作業を開始します。


1
gitignoreで指定された無関係なファイルを削除せずに、ダーティな既存ディレクトリをクリーンアップするためにHEADをリセットする必要がありました
Ray Foss

1
@cmcgintyの答えとは対照的に、これは実際に私のために働いたものです。
間違いなく

4
これはgit-cloneとまったく同じではありません。欠けているのは、masterブランチの上流の情報です。これはを追加することで修正できますgit branch --set-upstream-to=origin/master master
Slaven Rezic

このバージョンは、単にHEAD --hard gitのリセットをしなければならなかった、私のために働いた
フレデリック・クレー

29

警告-これにより、ファイルが上書きされる可能性があります。

git init     
git remote add origin PATH/TO/REPO     
git fetch     
git checkout -t origin/master -f

@cmcgintyの回答から変更されました--fなしでは私にとってうまくいきませんでした


確かに、この後にすべてのファイルをチェックアウトする必要がありますgit checkout .か?
Chris Stryczynski

25

これが私が同じ問題を抱えていたときに私がやったことです(少なくとも私は同じ問題だと思います)。私はディレクトリAに行って走りましたgit init

ディレクトリAのファイルの後にgitが続くことを望まないため、.gitignoreを編集して既存のファイルを追加しました。この後、私はgit remote add origin '<url>' && git pull origin masteretvoíla を実行しましたが、Bは単一のしゃっくりなしでAに「クローン」されます。


2
(元の質問で説明されているように)着信ファイルがすでに存在する場合、この手法は空でないディレクトリでは機能しません。
Araxia 2014

11

私はこれを少し前に使用しましたが、最も破壊的でない可能性のあるコマンドが必要です:

cd existing-dir
git clone --bare repo-to-clone .git
git config --unset core.bare
git remote rm origin
git remote add origin repo-to-clone
git reset

そしてボイラー!


10

別の簡単なレシピが私にはうまくいくようです:

git clone --bare $URL .git
git config core.bare false

既存のファイルがあるディレクトリにチェックアウトするための私の主な使用例は、GitでUnixドットファイルを制御することです。新しいアカウントでは、ホームディレクトリにはすでにいくつかのファイルが含まれています。おそらくGitから取得したいファイルも含まれます。


1
ベアリポジトリの設定は少し異なりますが、これは機能しますが、お勧めしません。:)
ThorSummoner 2016

1
より具体的にできますか?何が違うの?
ケンウィリアムズ

1
唯一の2つの違い:1.).git/configファイルは、リポジトリが裸であることを示しています。2.)通常保存されて.gitいるファイルはルートに保存されます(これはと呼ばれます.git
mozey

4
これらは、クローン先.gitと設定core.barefalseが処理する変更であり、この方法については今でも気分が良いです。
ケンウィリアムズ

10

これは私のために働きました:

cd existing_folder
git init
git remote add origin path_to_your_repo.git
git add .
git commit
git push -u origin master

6

ステージングWebサーバーとして使用する予定の新しいApache Webディレクトリ(WHMで作成されたアカウント)でも同様の問題がありました。私は最初にコードベースを含む新しいプロジェクトのクローンを作成し、リポジトリからプルして変更を定期的にデプロイする必要がありました。

問題は、アカウントに次のようなWebサーバーファイルがすでに含まれていることでした。

.bash_history
.bash_logout
.bash_profile
.bashrc
.contactemail
.cpanel/
...

...削除したり、リポジトリにコミットしたりしたくありませんでした。私は彼らがステージングされておらず、追跡もされていないままでいる必要がありました。

私がしたこと:

私は自分のWebフォルダー(existing_folder)に行きました:

cd /home/existing_folder

その後:

git init
git remote add origin PATH/TO/REPO
git pull origin master
git status

ステージングされていない多くのファイルのリスト(予想どおり)が表示されました。これらのファイルは、最初にcPanel Webアカウントからすでに存在していました。

次に、この記事のおかげで、これらのファイルのリストを次の場所に追加しました。

**.git/info/exclude**

このファイルは、ファイルとほぼ同じで、.gitignoreファイルがステージングされるのを無視できます。この後、私は.git /ディレクトリにコミットするものは何もありませんでした-それは.gitignore他の誰も見ることができない個人のように機能します。

git status戻り値をチェックしています:

On branch master
nothing to commit, working tree clean

これで、gitリポジトリからプルするだけで、このWebサーバーに変更をデプロイできます。これがWeb開発者の一部がステージングサーバーを簡単に作成するのに役立つことを願っています。



4

たぶん私はあなたの質問を誤解しましたが、ファイルをAからgitリポジトリBにコピー/移動し、必要なファイルをgit addで追加した方が簡単ではないでしょうかか?

更新:git docから:

既存のディレクトリへのクローン作成は、ディレクトリが空の場合にのみ許可されます。

出典:http : //git-scm.com/docs/git-clone


2
いいえ、所有者とファイルは任意である可能性があります。これは、複数の開発者がいる状況用です。私たち全員が既存のディレクトリを持ち、現在1つだけがgitチェックアウトを持っています。ほとんどの場合、同じファイルのサブセットがあるため、他の開発者がファイルを保持しながら複製できるようにしたいと考えています。そして、それは可能な限りエレガントで便利でなければなりません。
デールフォレスター

正直なところ、そのような状況で開発する意味はわかりません。ブランチとマージ操作を使用できませんか?または、外部依存関係を持つサブリポジトリがありますか?なぜ単一の「git checkout」に依存したいのですか?
Roberto Aloi

5
「単一のgitチェックアウト」は試練全体の要点ではありません。これが現状であり、前進する方法が必要なだけです。元の質問を更新して、機能しているように見えるソリューションを追加しました。でもフィードバックはありがたいです。
デールフォレスター

3
これには正当なケースがたくさんあります-プロジェクトのソースをセットアップする前にセットアップする必要のある複雑なフォルダーツリーがあり、そのフォルダーツリーには、たとえばGitHubに保存できないライセンスされた作品が含まれています。
BrainSlugs83 2014年

3

私は似たようなものを探していましたが、これが私が思いついたものです:

私の状況は、アクティブなWebツリーがあり、現在のWebツリーのファイルを移動せずに、そのリモートリポジトリを作成しようとしている状況です。これが私がしたことです:

  1. Webツリーに移動して実行します git init
  2. リポジトリの目的の場所に移動して実行します。 git clone --bare /path/to/web/repo
  3. リモートリポジトリの構成ファイルを編集し、[remote "origin"]セクションを削除します。
  4. [remote "origin"]新しいリモートリポジトリを指すWebツリーの.git / configにセクションを追加します。

私はこのレシピが大好きです。
ランド2014年

git clone --bareここでは、余分と回り道です。git remote add origin <URL>そもそもなぜですか?
Araxia 2014

3

これは私にとってはうまくいきますが、リモートリポジトリファイルをローカルファイルにマージする必要があります。

git init
git remote add origin url-to-git
git branch --set-upstream-to=origin/master master
git fetch
git status

1

私はデールの答えが好きで、私も追加しました

git clone --depth 2 --no-checkout repo-to-clone existing-dir/existing-dir.tmp
git branch dev_new214
git checkout dev_new214
git add .
git commit
git checkout dev
git merge dev_new214

浅い深さは、多くの余分な初期の開発コミットを回避しました。新しいブランチは、配置されたこのサーバーからのいくつかの新しいコードがあったという視覚的な履歴を私たちに与えてくれました。それは私の意見では完璧な使用ブランチです。ここに投稿してくれたすべての人々の素晴らしい洞察に感謝します。


0

c / codeに複製しようとしたときに同じ問題が発生しました

しかし、このフォルダーにはプロジェクトのすべてが含まれています。

c / code / newprojectに新しいフォルダーを作成し、自分のクローンをこのフォルダーにマッピングしました。

デスクトップ用のgitは私のユーザーに尋ね、それからうまくクローンしました。

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