我的目录A具有与目录B匹配的文件。目录A可能还有其他需要的文件。目录B是一个git repo。我希望它可以克隆.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


评论

也许您可以更改接受的答案?

#1 楼

这对我有用:

评论


当传入文件已经存在时(如原始问题所述),这在非空目录中不起作用。但是,如果您在git提取之后git reset origin / master,它将起作用(还保留所有本地更改)。

–荒地
2014年8月15日下午0:42

致命:无法同时更新路径并切换到分支“ master”。

–阿诺德·罗阿(Arnold Roa)
15年4月19日在23:43

这个答案对我不起作用。当我执行git checkout ... git抱怨我的所有文件都将被覆盖,我应该先移动它们。当我首先执行git reset origin / master /时,checkout命令抱怨名为master的分支已经存在。

–萨斯基亚
16-10-20在17:16

git checkout master对我来说是足够的最后一步。

– yoyo
17年1月11日在1:40

所有步骤都工作正常,但最后一个让我明白了:致命:已经存在一个名为“ master”的分支。我想我并不是真的需要它。

– Shadi
17-10-20在11:45



#2 楼

在以下Shell命令中,existing-dir是一个目录,其内容与git存储库中的repo-to-clone跟踪文件相匹配。 >

评论


我需要执行git reset --hard HEAD,否则它不会在“已删除”的文件上放弃。

–迪米塔尔
11年8月31日在18:25

git reset HEAD对我来说很好。 git reset --hard HEAD会破坏文件中的所有更改,因此,如果它们与存储库中的文件不完全相同,则不应这样做。

– Tgr
2012-12-19 19:58

git reset HEAD似乎对我没有任何影响。 git reset --hard HEAD可以-但是会丢失您对文件所做的任何更改。有更好的解决方案吗?

–雅各布·多曼(Jacob Dorman)
13年7月20日在1:14



@Casey的答案-git init / remote add / fetch / checkout-更干净,更简单,不需要任何临时文件夹。

– yoyo
14年7月25日在21:03

当文件夹中已经有文件需要保留但不在git repo中时,@ Casey的答案对我不起作用。这对于在运行创建了文件和目录的安装脚本之后更新配置非常有用,但是您需要在已安装项的顶部更新/添加文件。

–索尔斯顿
14年8月4日在15:58

#3 楼

对对我有用的答案之一进行了少许修改:

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

立即开始在master分支上工作。

评论


必须重置HEAD-很难清除脏的现有目录,而无需删除gitignore中指定的不相关文件

–雷·福斯(Ray Foss)
17年6月28日在17:25

这是对我真正有用的,而不是@cmcginty的答案。

–certainlyakey
17年7月7日在6:18

这并不完全等同于git-clone-缺少的是master分支的上游信息。这可以通过添加git branch --set-upstream-to = origin / master master来解决。

–Slaaven Rezic
18年4月20日在13:46

这个版本对我有用,只需要执行git reset --hard HEAD

–FrédéricKlee
19-09-17在15:11

#4 楼

警告-这可能会覆盖文件。

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


从@cmcginty的答案进行了修改-没有-f对我不起作用

评论


当然,此后您需要使用git checkout签出所有文件。

–克里斯·斯特里钦斯基(Chris Stryczynski)
19年4月13日在11:03

#5 楼

这是我遇到相同问题时所要做的(至少我认为这是相同问题)。我进入目录A并运行git init。由于我不希望git跟随目录A中的文件,因此我编辑了.gitignore并将现有文件添加到其中。之后,我运行了git remote add origin '<url>' && git pull origin master etvoíla,将B克隆到A中而没有打h。

评论


当传入文件已经存在时(如原始问题所述),该技术不适用于非空目录。

–荒地
14年8月15日在0:49

#6 楼

另一个简单的方法似乎很适合我:

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


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

评论


裸存储库的设置略有不同,尽管确实可以,但我不建议这样做。 :)

–雷神召唤师
16-02-17 '23:54

你可以说得更详细点吗?有什么不同吗?

–肯·威廉姆斯
16-2-18的2:02

只有两个区别:1.).git / config文件指示存储库是裸露的。 2.)通常存储在.git中的文件存储在根目录(您称为.git)

– mozey
17年2月1日16:00



这些正是克隆到.git并将core.bare设置为false所需要的更改,因此我对这种方法仍然感觉很好。

–肯·威廉姆斯
17年5月18日在22:12

#7 楼

我刚才使用过此功能,需要的破坏性最低的命令:


#8 楼

这对我有用:

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


#9 楼

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

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

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


...我不想删除或提交到我的存储库。我需要他们呆在那儿且没有跟踪。

我做了什么:

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

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返回: br />
现在,我只需从git存储库中提取内容就可以将更改部署到此Web服务器。希望这有助于某些Web开发人员轻松创建登台服务器。

#10 楼

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

UPDATE:来自git doc :


仅当目录为空时才允许复制到现有目录。


源:http://git-scm.com / docs / git-clone

评论


不,所有者和文件可以是任意的。这是针对多个开发人员的情况。我们都有现有的目录,并且只有一个当前具有git checkout。我们所有人都具有相同的文件子集,因此我们希望其他开发人员能够在保留其文件的同时进行克隆。而且它应该尽可能优雅和方便。

–戴尔·森林人
10 Mar 9 '10 at 17:32

老实说,我看不到在这种情况下发展的意义。您不能使用分支和合并操作吗?还是拥有带有外部依赖项的子存储库?您为什么要依赖一个“ git checkout”?

– Roberto Aloi
2010年3月9日在18:01

“单次git checkout”不是整个折磨的重点。就是这样,我们需要一种前进的方式。我用似乎有效的解决方案更新了原始问题。不过,我感谢您的反馈。

–戴尔·森林人
2010年3月9日在18:14

对此有很多合理的案例-我必须设置一个复杂的文件夹树,然后才能设置我的项目源,并且该文件夹树包含例如不能存储在GitHub上的许可作品。

– BrainSlugs83
2014年10月10日下午5:09

#11 楼

这是我在做什么:

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


#12 楼

这对我来说是工作,但您应该将远程存储库文件合并到本地文件:

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


#13 楼

我一直在寻找类似的东西,这是我想出的:

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


转到Web树并运行git init

转到存储库的预期位置并运行:git clone --bare /path/to/web/repo

在我的远程仓库中编辑配置文件,然后删除[remote "origin"]部分。
在Web树中的.git / config中添加一个指向新远程仓库的[remote "origin"]部分。


评论


我很喜欢这个食谱。

– dland
2014年6月2日在18:05

git clone --bare在这里是多余和circuit回的。为什么不首先使用git remote add origin

–荒地
14年8月15日,0:55

#14 楼

我喜欢Dale的回答,而且还添加了

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


较浅的深度避免了很多额外的早期开发人员提交。新分支为我们提供了良好的可视化历史记录,该服务器中放置了一些新代码。在我看来,这是完美使用的分支。感谢所有发布在此的人的深刻见解。

#15 楼

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

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

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

在桌面上使用git,然后询问我的用户,然后进行克隆。

#16 楼

以下对我有用。首先,我要确保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