究竟是什么git init
?我必须每台计算机执行一次,或者每个使用git的项目执行一次吗?我通过git clone
下载了我的项目并使其正常工作,但现在它也将我的项目存储到C:/Users/myUser/git
,是某个文件夹还是我可以更改它?
我对该文件夹并不是很了解,它看起来像是一个本地git仓库或其他什么东西,但是“管理”它的原因,或者它为什么使用这条路径,你能解释一下吗?
这是我理解的,如果我不正确,请修理我,需要直接了解事实:
git init
适用于每个项目git commit
时,该文件夹都会更新。git push
时,它需要从该本地仓库获取,然后放入远程存储库。git pull
答案 0 :(得分:36)
这实际上是很多问题和误解。我不确定我是否能够解决这些问题所以我只会解决直接问到的问题。
git init适用于每个项目
几乎正确。 git init
用于开始在不在git下的项目上使用git。对于已经在git下的项目,您使用git clone
。
“用户”下的git文件夹是本地回购
几乎正确。该文件夹实际上是.git
而不是git
。这来自unix约定,所有以点开头的文件和文件夹都被视为隐藏。
其次,该文件夹不在“用户”文件夹下。它位于您的项目文件夹下。因此文件夹C:/Users/myUser/
是一个项目。如果这不是您的意图,那么您很可能在用户文件夹中意外执行了git init
。
每个项目在项目的根目录中都有一个.git
文件夹,这是项目的存储库。这是git与svn或cvs相比如此之快的原因之一 - 整个存储库在本地硬盘上处理而没有任何网络流量。
当我执行git push时,它需要来自本地仓库,然后放入远程
正确,但仅适用于具有遥控器的存储库(通常是使用git clone
复制远程存储库创建的存储库)。
请注意,远程仓库不需要在另一台计算机上。您可以将项目从本地文件夹git克隆到另一个文件夹,然后将更改从新文件夹推回到原始文件夹。
git clone
命令会自动为您的仓库设置必要的配置以连接回远程。但您也可以手动配置使用git init
设置的仓库以连接到遥控器。
“管理”它
.git
文件夹管理您项目的回购。 Git不作为服务器运行*。相反,.git
文件夹充当所有git命令与之通信的本地“服务器”。基本上,运行git命令会编辑.git
文件夹的内容。
*注意:远程回购会运行服务器,以便您可以连接它们。但从技术上讲,他们并不是真正的 git 服务器。它们是git可以下载并上传到的文件服务器。
答案 1 :(得分:3)
你的三个四个理解或多或少是正确的,尽管你遗漏了一些细节。
git init
初始化(即创建)存储库。每个项目都应该在自己的存储库中。
如果您使用git clone
下载了项目,则无需再次运行git init
。
您应该能够将项目复制到另一个目录而不会产生任何不利影响。该路径可能是默认选择的。务必移动整个目录。 git需要运行的元数据存储在项目目录中的隐藏文件中。
推送和拉动可能会变得复杂,特别是当您与他人合作时,以及当您使用分支机构时。在这里写一篇关于这个主题的完整介绍对我来说真的不明智,所以我建议你去阅读Pro Git以获得更全面的解释。
答案 2 :(得分:2)
git init
仅适用于从头开始创建自己的新存储库的情况。它将目录转换为空的git存储库。
当您使用git clone
将现有存储库克隆到新存储库时,git init
既不必要也不需要。
答案 3 :(得分:0)
@Jaanus是@slebetman对git pull
所作解释的补充。它不是完全同步,而是获取不在本地的提交。这更多的是极端情况,请考虑以下问题-
假定要处理一个分支test_branch。对于origin/test_branch
(git服务器上的分支),存在A,B和C提交,其中C是最近的提交。您已经拉了一下,现在本地分支上也有A,B和C。
比方说,由于某种原因,您不得不重置提交B并强制重写origin/test_branch
的历史记录,而将历史记录保留为A和C。
现在当您在本地执行git pull
时。它会说everything already up to date
,但是请注意您还有提交B的其他更改。因此,请勿将其视为同步操作,而应将其更多地视为get what I don't have
操作。
希望是有帮助的。
答案 4 :(得分:-1)
#!bin/bash
DATE=`date +%m%d%Y.%H%M%S`
TARGET="$1.$DATE"
DIR=`pwd`
function batch_convert() {
for file in `ls $1`
do
if [ -d $1"/"$file ]
then
batch_convert $1"/"$file
else
dos2unix $1"/"$file
#echo $1"/"$file
fi
done
}
##################
echo $TARGET
cd $DIR/DCW
git pull
cd ../
batch_convert DCW
cp -R DCW tmp/$TARGET
cd tmp/$TARGET
find . -type d -name "*git*"| xargs -n20 rm -rf
for db in `cat $DIR/tmp/$TARGET/Dblist` ; do
echo "********** DB IS $db *******"
for dbfolder in `find * -maxdepth 0 -type d` ;do
echo `ls -a`
echo "***** DBFolder is $dbfolder *****"
if [ ! $dbfolder = $db ];then
cp -R $dbfolder $db
find $db -name "*.ctl"| xargs -I '{}' mv '{}' $db/${db}.ctl
fi
done
done
cd ../
tar -cf $TARGET.tar $TARGET