Как клонировать в непустой каталог?

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

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

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

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

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

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

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

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

Ответ 1

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

# Clone just the repository .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

Ответ 2

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

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 установит ветвь для вас, если это то, что вы хотите, и обычно это так.

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

Предупреждение - это может перезаписать файлы.

git init     
git remote add origin PATH/TO/REPO     
git fetch     
git checkout -t origin/master -f

Изменено с @cmcginty answer - без -f у меня это не сработало

Ответ 6

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

cd existing_folder
git init
git remote add origin path_to_your_repo.git
git add .
git commit
git push -u origin master

Ответ 7

Другой простой рецепт, похоже, хорошо работает для меня:

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

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

Ответ 8

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

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

И воля!

Ответ 9

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

ОБНОВЛЕНИЕ: Из Git Doc:

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

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

Ответ 10

Я искал что-то подобное, и вот что я придумал:

Моя ситуация такова, что у меня есть активное веб-дерево, и я пытался создать для него удаленный репозиторий, не перемещая ни одного из файлов в текущем веб-дереве. Вот что я сделал:

  • Перейдите в веб-дерево и запустите git init
  • Перейдите в предполагаемое местоположение репозитория и запустите: git clone --bare /path/to/web/repo
  • Отредактируйте конфигурационный файл в удаленном репо и удалите раздел [remote "origin"].
  • Добавьте раздел [remote "origin"] в .git/config в веб-дереве, указав на новое дистанционное репо.

Ответ 11

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

git init
git remote add origin url-to-git
git branch --set-upstream-to=origin/master master
git fetch
git status

Ответ 12

Вот что я делаю:

git clone repo /tmp/folder
cp -rf /tmp/folder/.git /dest/folder/
cd /dest/folder
git checkout -f master

Ответ 13

У меня была похожая проблема с новым веб-каталогом Apache (учетная запись, созданная с помощью WHM), которую я планировал использовать в качестве промежуточного веб-сервера. Сначала мне нужно было клонировать мой новый проект с базой кода и периодически вносить изменения, извлекая данные из репозитория.

Проблема заключалась в том, что учетная запись уже содержала файлы веб-сервера, такие как:

.bash_history
.bash_logout
.bash_profile
.bashrc
.contactemail
.cpanel/
...

... что я не хотел ни удалять, ни фиксировать в своем хранилище. Мне нужно было, чтобы они оставались там без посторонних и неотслеживаемых.

Что я сделал:

Я зашел в свою веб-папку (существующая_фолдер):

cd /home/existing_folder

а затем:

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

В нем отображался (как и ожидалось) список многих не подготовленных файлов - тех, которые изначально существовали в моей учетной записи cPanel.

Затем, благодаря этой статье, я просто добавил список этих файлов в:

**.git/info/exclude**

Этот файл, почти как файл .gitignore, позволяет игнорировать файлы, находящиеся в стадии подготовки. После этого мне нечего было делать в каталоге .git / - он работает как личный .gitignore, который никто не может увидеть.

Теперь проверка git status возвращает:

On branch master
nothing to commit, working tree clean

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

Ответ 14

Мне понравился ответ Дейла, и я также добавил

git clone --depth 2 --no-checkout repo-to-clone existing-dir/existing-dir.tmp
git branch dev_new214
git checkout dev_new214
git add .
git commit
git checkout dev
git merge dev_new214

Малая глубина избежала множества дополнительных ранних изменений. Новая ветка дала нам хорошую визуальную историю, что был добавлен новый код с этого сервера. На мой взгляд, это идеальное использование веток. Спасибо большое за понимание всех людей, которые разместили здесь.