プロジェクトの作業用コピーがあり、ソース管理メタデータがありません。ここで、このフォルダーにgit-cloneと同等の操作を行い、ローカルの変更を保持します。
git-cloneでは、既存のフォルダーにクローンを作成できません。ここでのベストプラクティスは何ですか?
プロジェクトの作業用コピーがあり、ソース管理メタデータがありません。ここで、このフォルダーにgit-cloneと同等の操作を行い、ローカルの変更を保持します。
git-cloneでは、既存のフォルダーにクローンを作成できません。ここでのベストプラクティスは何ですか?
回答:
これは、新しいディレクトリにクローンを作成し、その.git
ディレクトリを既存のディレクトリに移動することで実行できます。
既存のディレクトリの名前が「コード」の場合。
git clone https://myrepo.com/git.git temp
mv temp/.git code/.git
rm -rf temp
これは、cloneコマンドの実行中にチェックアウトを行わなくても実行できます。詳細については、こちらをご覧ください。
git clone
最初のコマンドとして使用する限り、それ以上のチェックアウトコマンドは必要ありません。代わりgit clone --no-checkout
にその最初のステップのようなものを使用する場合、.gitディレクトリが移動した後git reset HEAD
、ファイルが削除されていないことをgitに通知するために使用する必要があります。
git status
。
クローンを作成せず、代わりにフェッチしてください。リポジトリでは:
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...
クローンしたようなものです。
ここで興味深い質問(および答えのない質問):裸のツリーがどのコミットに基づいているか、つまりどの位置にリセットするかを知る方法。
次のようにして、既存のディレクトリのマスターブランチをチェックアウトしました。
git init
git remote add origin [my-repo]
git fetch
git checkout origin/master -ft
-t
ここでフラグが使用されている理由を誰かが説明できますか?
私がいただきたいgit clone
新しいディレクトリにして、新しいクローンに既存のディレクトリの内容をコピーします。
git clone wherever tmp && git mv tmp/.git . && rm -rf tmp
つまり、.git
一時的なクローンからディレクトリを移動する方が、クローンの作業ツリーをクリーンアップして既存のファイルをそこにコピーするよりも簡単に見えます。
git mv tmp/.git .
が戻っfatal: cannot move directory over file, source=tmp/.git, destination=.git
てきました。誰が問題が何であるか知っていますか?
mv
ではなくgit mv
、ただし、.git
ファイルが既に存在する理由は説明されていません(gitdir: some/path/to/a/git-dir
「gitfile」が含まれています。存在しない場合は、fatal: Not a git repository (or any of the parent directories): .git
代わりに表示されます)。
一時ディレクトリの使用は問題ありませんが、そのステップを回避したい場合はこれでうまくいきます。作業ディレクトリのルートから:
$ rm -fr .git
$ git init
$ git remote add origin your-git-url
$ git fetch
$ git reset --mixed origin/master
git reset --hard origin/master
ローカルファイルを削除します。
hard
と、mixed
混合ローカルの変更を保つことである(後で、それはあなたの例を紹介します引っ張ってみてくださいもしそうなら:あなたはunstaged変更がコミットまたはそれらを隠してくださいリベースを引くことはできません。) 、ハードはこれらのローカルな変更を破棄します
git clone your_repo tmp && mv tmp/.git . && rm -rf tmp && git reset --mixed
git reset --hard
すると、ローカルファイルの変更、特にこのOPが要求したものではありません。--mixed
代わりに使用する必要があります。
git repoを空の既存のディレクトリに複製するには、次のようにします。
cd myfolder
git clone https://myrepo.com/git.git .
コマンド.
の最後にがあることに注意してくださいgit clone
。これにより、リポジトリが現在の作業ディレクトリにダウンロードされます。
fatal: destination path '.' already exists and is not an empty directory.
これには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
、ローカルのすべての変更のコピーを脇に置いておき、それらを再適用して、コミットしたい変更を処理することです。
* どちらの例も、プロジェクトの親ディレクトリのシェルから始めることを前提としています。
これは私が出会ったすべての方法の中で最高です
リポジトリの.gitフォルダー(既に存在するファイルを除くexisting-dir
)のみを空の一時ディレクトリに複製します。
git clone --no-checkout repo-path-to-clone existing-dir/existing-dir.tmp
//ローカルリポジトリを複製するための--no-hardlinksが必要な場合があります.gitフォルダーをファイルのあるディレクトリに移動します。これはexisting-dir
gitリポジトリになります。
mv existing-dir/existing-dir.tmp/.git existing-dir/
一時ディレクトリを削除します
rmdir existing-dir/existing-dir.tmp
cd existing-dir
Gitはすべてのファイルが削除されたと見なし、これによりリポジトリの状態がHEADに戻ります。
警告:ファイルに対するローカルの変更はすべて失われます。
git reset --mixed HEAD
少なくとも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
作業コピーにしたいディレクトリにメタデータディレクトリが既に存在する場合、これは明らかに機能しません。
[core]
の両方を含むローカル設定のセクションbare = true
と bare = false
。さらに問題なのは、origin
リモートに対して間違った値が[remote "origin"]
含まれ、セクションが含まれていることmirror = true
、およびフェッチ仕様が作業コピーでは正しく機能しないことです。これらの問題を修正した後は、通常のクローン作成と新しい作業コピーの移動.git
がより効率的になります。
これを行うには、次のコマンドラインを再帰的に入力します。
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