Каков наилучший способ «git clone» в существующую папку? - PullRequest
389 голосов
/ 21 марта 2011

У меня есть рабочая копия проекта, без каких-либо метаданных контроля версий.Теперь я хотел бы сделать эквивалент git-clone в эту папку и сохранить свои локальные изменения.

git-clone не позволяет мне клонировать в существующую папку.Какова лучшая практика здесь?

Ответы [ 12 ]

456 голосов
/ 13 декабря 2012

Это можно сделать путем клонирования в новый каталог, а затем переместить каталог .git в существующий каталог.

Если существующий каталог называется «code».

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

Это также можно сделать без проверки во время выполнения команды клонирования; больше информации можно найти здесь .

232 голосов
/ 03 июня 2013

Не клонируйте, вместо этого выбирайте. В репо:

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...

и ты как клонированный.

Интересный вопрос здесь (и тот, на котором нет ответа): как узнать, на каком коммите было основано ваше голое дерево, и, следовательно, на какую позицию сбросить.

49 голосов
/ 18 марта 2016

Я сделал следующее, чтобы оформить основную ветку в существующем каталоге:

git init
git remote add origin [my-repo]
git fetch
git checkout origin/master -ft
37 голосов
/ 21 марта 2011

Я бы git clone в новый каталог и скопировать содержимое существующего каталога в новый клон.

29 голосов
/ 14 августа 2013

Использование временного каталога - это нормально, но это будет работать, если вы хотите избежать этого шага. Из корня вашего рабочего каталога:

$ rm -fr .git
$ git init
$ git remote add origin your-git-url
$ git fetch
$ git reset --mixed origin/master
10 голосов
/ 21 марта 2013
git clone your_repo tmp && mv tmp/.git . && rm -rf tmp && git reset --mixed
2 голосов
/ 02 марта 2017

Чтобы клонировать git-репо в пустой существующий каталог, сделайте следующее:

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

Обратите внимание на . в конце вашей команды git clone.Это загрузит репо в текущий рабочий каталог.

2 голосов
/ 22 мая 2013

Есть два подхода к этому. Там, где это возможно, я бы начал с чистой папки для вашего нового рабочего каталога 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, чтобы получить копию всех ваших локальных изменений, отложенных в сторону, затем вы можете повторно применить их и работать с теми, которые вы хотите зафиксировать.

* В обоих примерах предполагается, что вы запускаете оболочку в родительском каталоге вашего проекта.

1 голос
/ 31 июля 2018

Это лучший из всех методов, с которыми я сталкивался

Клонировать только папку .git хранилища (за исключением файлов, которые уже находятся в existing-dir) в пустой временный каталог

  1. git clone --no-checkout repo-path-to-clone existing-dir/existing-dir.tmp // может потребоваться --no-hardlinks для клонирования локального репо

Переместить папку .git в каталог с файлами.Это делает existing-dir мерзавцем.

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

Удалить временный каталог

rmdir existing-dir/existing-dir.tmp

cd existing-dir

Git считает, что все файлы удалены, это отменяет состояние репов ГОЛОВУ.

ВНИМАНИЕ: любые локальные изменения файлов будут потеряны.

git reset --mixed HEAD
1 голос
/ 25 октября 2017

Множество ответов уже сделано так, как задал ОП. Но стоит отметить, что сделать это наоборот гораздо проще:

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

Теперь у вас есть желаемое целевое состояние - свежий клон + локальные изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...