У меня есть рабочая копия проекта, без каких-либо метаданных контроля версий. Теперь я хотел бы сделать эквивалент git-clone в эту папку и сохранить свои локальные изменения.
git-clone не позволяет мне клонировать в существующую папку. Какова лучшая практика здесь?
Ответы:
Это можно сделать путем клонирования в новый каталог, а затем переместить
.git
каталог в существующий каталог.Если ваш существующий каталог называется «код».
Это также можно сделать без проверки во время выполнения команды клонирования; Более подробную информацию можно найти здесь .
источник
git clone
в качестве первой команды, дальнейшая команда извлечения не требуется. Если вместо этого вы используете что-то похожееgit clone --no-checkout
на этом первом шаге, то после перемещения каталога .git необходимоgit reset HEAD
будет указать git, что файлы не были удалены.git status
.Не клонируйте, принесите вместо этого. В репо:
Затем вы можете сбросить дерево, чтобы получить коммит, который вы хотите:
и ты как клонированный.
Интересный вопрос здесь (и тот, на котором нет ответа): как узнать, на каком коммите было основано ваше голое дерево, и, следовательно, на какую позицию сбросить.
источник
Следующее, что я сделал, чтобы оформить основную ветку в существующем каталоге:
источник
-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
вместо этого видели ).Использование временного каталога - это нормально, но это сработает, если вы хотите избежать этого шага. Из корня вашего рабочего каталога:
источник
git reset --hard origin/master
удалит все локальные файлы.hard
и вmixed
том, что смешанный, сохранит локальные изменения (поэтому, если вы позже попытаетесь вытащить его, он покажет вам, например, Невозможно вытащить с ребазой: у вас есть неподготовленные изменения. Передайте или сохраните их ) , хотя hard откажется от этих локальных измененийисточник
git reset --hard
обнулит изменения локального файла, в частности, НЕ то, что запрашивал этот OP.--mixed
следует использовать вместоЧтобы клонировать git-репо в пустой существующий каталог, сделайте следующее:
Обратите внимание
.
на в конце вашейgit clone
команды. Это загрузит репо в текущий рабочий каталог.источник
fatal: destination path '.' already exists and is not an empty directory.
Множество ответов уже сделано так, как задал ОП. Но стоит отметить, что сделать это наоборот гораздо проще:
Теперь у вас есть желаемое целевое состояние - свежий клон + локальные изменения.
источник
Есть два подхода к этому. Там, где это возможно, я бы начал с чистой папки для вашего нового рабочего каталога git, а затем скопировал вашу версию вещей позже. Это может выглядеть примерно так: *
На этом этапе у вас должна быть довольно чистая рабочая копия с вашей предыдущей рабочей папкой в качестве текущего рабочего каталога, поэтому любые изменения, включая удаление файлов, будут отображаться на радаре, если вы запустите
git status
.С другой стороны, если вам действительно нужно сделать это наоборот, вы можете получить тот же результат с помощью чего-то вроде этого:
В любом случае, первое, что я хотел бы сделать, это запустить что-то вроде
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
папку--mirror
превращает новый клон в папку с метаданными, как это.git
необходимо--config core.bare=false
countermands неявноеbare=true
из--mirror
опции, тем самым позволяя хранилище иметь соответствующий рабочий каталог и действовать как обычный клонЭто, очевидно, не будет работать, если
.git
каталог метаданных уже существует в каталоге, который вы хотите превратить в рабочую копию.источник
[core]
разделу локальной конфигурации, включая обаbare = true
иbare = false
. Более проблематичным является то, что он будет иметь неправильные значения дляorigin
удаленного, с[remote "origin"]
включенным разделомmirror = true
и спецификацией выборки, которая не будет работать должным образом с рабочей копией. После исправления этих проблем клонирование в нормальном режиме и перемещение новой рабочей копии.git
будет более эффективным.Обычно я сначала клонирую исходный репозиторий, а затем перемещаю все в существующей папке в исходный репозиторий. Это работает каждый раз.
Преимущество этого метода в том, что вы не пропустите ничего из исходного репозитория, включая README или .gitignore.
Вы также можете использовать команду ниже, чтобы завершить шаги:
источник
Вы можете сделать это, набрав следующие командные строки рекурсивно:
источник
Просто используйте. в конце
git clone
команды (находящейся в этом каталоге), вот так:источник