Какая лучшая практика для "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/
Теперь у вас есть целевое состояние - новый клон + локальный.