Какая лучшая практика для "git clone" в существующей папке?

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Затем вы можете reset дерево получить требуемую фиксацию:

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

и вы похожи на клонированных.

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

Следующее, что я сделал, чтобы проверить главный ветвь в существующем каталоге:

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

Ответ 7

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


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

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

Ответ 8

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

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

Ответ 9

Если вы используете не менее 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 сопоставляет неявный bare=true параметр --mirror, тем самым позволяя репозиторию иметь связанный с ним рабочий каталог и действовать как обычный клон

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

Ответ 10

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

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

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