Как мне клонировать в непустую директорию? - PullRequest
520 голосов
/ 09 марта 2010

У меня есть каталог A с файлами, совпадающими с каталогом B. В каталоге A могут быть другие необходимые файлы. Директория B - это git-репо.

Я хочу клонировать каталог B в каталог A, но git-clone не разрешит мне, так как каталог не пустой.

Я надеялся, что он просто клонирует .git, и, поскольку все файлы совпадают, я могу перейти оттуда?

Я не могу клонировать в пустой каталог, потому что у меня есть файлы в каталоге A, которых нет в каталоге B, и я хочу их сохранить.

Копирование .git не вариант, так как я хочу, чтобы ссылки пушли / толкались, и я не хочу их настраивать вручную.

Есть ли способ сделать это?

Обновление: я думаю, что это работает, кто-нибудь может увидеть какие-либо проблемы? ->

cd a
git clone --no-hardlinks --no-checkout ../b a.tmp 
mv a.tmp/.git .
rm -rf a.tmp
git unstage # apparently git thinks all the files are deleted if you don't do this

Ответы [ 14 ]

652 голосов
/ 25 сентября 2013

Это сработало для меня:

git init
git remote add origin PATH/TO/REPO
git fetch
git reset origin/master  # Required when the versioned files existed in path before "git init" of this repo.
git checkout -t origin/master

ПРИМЕЧАНИЕ: -t установит для вас ветвь восходящего потока, если это то, что вы хотите, и обычно это так.

145 голосов
/ 20 марта 2010

В следующих командах оболочки existing-dir - это каталог, содержимое которого соответствует отслеживаемым файлам в репозитории repo-to-clone git.

# Clone just the repository's .git folder (excluding files as they are already in
# `existing-dir`) into an empty temporary directory
git clone --no-checkout repo-to-clone existing-dir/existing-dir.tmp # might want --no-hardlinks for cloning local repo

# Move the .git folder to the directory with the files.
# This makes `existing-dir` a git repo.
mv existing-dir/existing-dir.tmp/.git existing-dir/

# Delete the temporary directory
rmdir existing-dir/existing-dir.tmp
cd existing-dir

# git thinks all files are deleted, this reverts the state of the repo to HEAD.
# WARNING: any local changes to the files will be lost.
git reset --hard HEAD
91 голосов
/ 16 марта 2015

Небольшая модификация одного из ответов, который работал для меня:

git init
git remote add origin PATH/TO/REPO
git pull origin master

чтобы сразу начать работу над мастер-веткой.

25 голосов
/ 20 января 2013

Вот что я в итоге делал, когда у меня была та же проблема (по крайней мере, я думаю, что это та же проблема). Я вошел в каталог A и побежал git init.

Поскольку я не хотел, чтобы за файлами в каталоге A следовал git, я отредактировал .gitignore и добавил в него существующие файлы. После этого я запустил git remote add origin '<url>' && git pull origin master et voíla, B «клонируется» в A без единого сбоя.

19 голосов
/ 08 апреля 2017
git init 

git remote add origin PATH/TO/REPO 

git fetch 

git checkout -t origin/master -f

Изменено с @ ответа cmcginty - без -f у меня не получилось

10 голосов
/ 22 августа 2016

Это сработало для меня:

cd existing_folder
git init
git remote add origin path_to_your_repo.git
git add .
git commit
git push -u origin master
9 голосов
/ 28 января 2015

Другой простой рецепт мне подходит:

git clone --bare $URL .git
git config core.bare false

Мой основной вариант использования для извлечения каталога с существующими файлами - это управление моими точечными файлами Unix с помощью Git. В новой учетной записи в домашнем каталоге уже будут некоторые файлы, возможно, даже те, которые я хочу получить из Git.

8 голосов
/ 22 сентября 2017

Я использовал это несколько минут назад, требуются наименее потенциально разрушительные команды:

cd existing-dir
git clone --bare repo-to-clone .git
git config --unset core.bare
git reset

И вуаля!

4 голосов
/ 09 марта 2010

Возможно, я неправильно понял ваш вопрос, но не будет ли проще, если вы скопируете / переместите файлы из A в git repo B и добавите нужные с помощью git add ?

ОБНОВЛЕНИЕ: из git doc:

Клонирование в существующий каталог допускается только в том случае, если каталог пуст.

ИСТОЧНИК: http://git -scm.com / docs / git-clone

3 голосов
/ 16 ноября 2016

это работа для меня , но вы должны объединить файлы удаленного репозитория с локальными файлами:

git init
git remote add origin url-to-git
git branch --set-upstream-to=origin/master master
git fetch
git status
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...