如何克隆到非空目录?

时间:2010-03-09 17:23:49

标签: git

我的目录A包含与目录B匹配的文件。目录A可能包含其他所需文件。目录B是一个git repo。

我想将目录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

17 个答案:

答案 0 :(得分:649)

这对我有用:

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会为您设置上游分支,如果这是您想要的,通常是。

答案 1 :(得分:144)

在以下shell命令中,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

答案 2 :(得分:92)

稍微修改一个对我有用的答案:

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

立即开始处理主分支。

答案 3 :(得分:25)

这是我遇到同样问题时最终做的事情(至少我认为这是同样的问题)。我进入目录A并运行git init

由于我不希望目录A中的文件后跟git,我编辑了.gitignore并将现有文件添加到其中。在此之后我跑了git remote add origin '<url>' && git pull origin masteretvoíla,B被“克隆”成A而没有一次打嗝。

答案 4 :(得分:18)

git init 

git remote add origin PATH/TO/REPO 

git fetch 

git checkout -t origin/master -f

@cmcginty's answer修改 - 没有-f它对我不起作用

答案 5 :(得分:10)

这对我有用:

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

答案 6 :(得分:9)

另一个简单的配方似乎对我有用:

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

我检查带有现有文件的目录的主要用例是使用Git控制我的Unix dotfiles。在一个新帐户上,主目录中已经有一些文件,甚至可能是我想从Git获取的文件。

答案 7 :(得分:8)

我刚刚使用过它,需要最少的潜在破坏性命令:

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

瞧!

答案 8 :(得分:4)

也许我误解了你的问题,但如果你将文件从A复制/移动到git repo B并用 git add 添加所需的文件,会不会更简单?

更新:来自git doc:

  

只有在目录为空时才允许克隆到现有目录中。

消息来源:http://git-scm.com/docs/git-clone

答案 9 :(得分:3)

这对我有用,但您应该将远程存储库文件合并到本地文件:

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

答案 10 :(得分:3)

我正在寻找类似的东西,这就是我想出的:

我的情况是我有一个活动的Web树,我试图为它创建一个远程存储库,而无需移动当前Web树中的任何文件。这是我做的:

  1. 转到网络树并运行git init
  2. 转到存储库的目标位置并运行:git clone --bare /path/to/web/repo
  3. 在我的远程仓库中编辑配置文件,然后删除[remote "origin"]部分。
  4. 在指向新远程仓库的网络树中,将[remote "origin"]部分添加到.git / config。

答案 11 :(得分:1)

我喜欢Dale's answer,我还添加了

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

浅深度避免了很多额外的早期开发提交。新分支给了我们一个很好的视觉历史,这个服务器中有一些新的代码被放入。在我看来,这是完美的使用分支。感谢所有发布在这里的人的深刻见解。

答案 12 :(得分:1)

以下是我正在做的事情:

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

答案 13 :(得分:1)

尝试克隆到c / code时遇到相同的问题

但是此文件夹包含一堆项目。

我在c / code / newproject中创建了一个新文件夹 并将我的克隆映射到该文件夹​​。

桌面版git,然后询问我的用户,然后将其克隆很好。

答案 14 :(得分:0)

我打算将新的Apache Web目录(使用WHM创建的帐户)遇到类似的问题,该目录打算用作暂存Web服务器。我首先需要使用代码库克隆新项目,然后通过从存储库中提取代码来定期部署更改。

问题在于该帐户已包含Web服务器文件,例如:

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

我既不会删除也不不会提交到我的存储库。我留意了他们,让他们呆在原地踏步,无路可走。

我做了什么:

  1. 我进入了我的Web文件夹(existing_folder):

    cd / home / existing_folder

然后:

git init
git remote add origin PATH/TO/REPO
git pull origin master
  1. 然后我检查了git状态:

    git status

它(按预期方式)显示了许多未分级文件的列表-这些文件最初是从我的cPanel网络帐户开始存在的。

  1. 然后感谢本文https://medium.com/@dave_lunny/exclude-files-from-git-without-committing-changes-to-gitignore-986fa712e78d,我将这些文件的列表添加到了:

    .git / info / exclude

此文件几乎与.gitignore文件一样,使您可以忽略暂存的文件。此后,我没有什么要提交到.git /目录中的-ti就像一个个人的.gitignore,其他人都看不到。

现在检查git状态返回:

On branch master
nothing to commit, working tree clean

现在,只需从git存储库中提取内容,就可以将更改部署到此Web服务器。 希望这有助于某些Web开发人员轻松创建登台服务器。

答案 15 :(得分:0)

以下内容对我有用。首先,我要确保a目录中的文件是源代码控制的:

$ cd a
$ git init
$ git add .
$ git commit -m "..."

然后

$ git remote add origin https://URL/TO/REPO
$ git pull origin master --allow-unrelated-histories
$ git push origin master

答案 16 :(得分:0)

这个问题有很多答案,我认为其中没有一个包括将 A 初始化为 Git 存储库然后从 B 拉到 A 的选项。

ffmpeg -f concat -i input.txt -vf "drawtext=text='%{metadata\:length}':fontsize=22:fontcolor=white:x=w-tw-10:y=h-th-10,format=yuv420p" output.mp4