繁体   English   中英

在服务器端创建一个git存储库

[英]Create a git repository on server side

我有一个大问题,我无法理解这个话题。 我有一个带网站的服务器。 我用git init在那里创建了一个存储库。 比我做了一个git add *将所有文件从我的服务器添加到存储库。 比我commit将所有文件commit到存储库。

比我用git clone ssh://username@mysite.com/wordpress/.git将它git clone ssh://username@mysite.com/wordpress/.git到我的本地客户端。

一切正常,我从我的项目中得到了一份副本。 不,我在我的本地版本上改变了一些内容,并通过push进行了commit 我查看了FileZilla,但文件中的内容没有改变。 在另一个方向,当我在服务器上更改了某些内容并将其pulled本地副本时,我看到了更改。 您知道为什么我在本地副本上所做的更改在我的服务器上不可见吗?

谢谢您的帮助!

您需要将更改推送到本地计算机和服务器都可以从中取出的中央存储库(或将它们作为远程添加到彼此)。 像GitHub这样的服务很适合这个。 以下是适用于此的完整工作流程的说明。 更新的说明可以在这个要点中找到。 此工作流使用挂钩来完成繁重的工作,以便自动更新服务器。

使用Git管理实时网站

概观

作为一名自由职业者,我建立了很多网站。 这需要跟踪很多代码更改。 值得庆幸的是,具有适当分支的Git启用的工作流程可以缩短项目跟踪工作。 我可以很容易地看到分支机构中的开发功能以及站点生产代码的快照。 对该工作流程的一个很好的补充是能够使用Git将更新推送到我提交更改时所处理的各个站点。

您需要在开发计算机上以及要托管网站的服务器或服务器上安装Git。 此过程甚至可以适用于多个服务器,例如负载均衡器后面的镜像。

设置无密码SSH访问

更新实时Web服务器的过程依赖于在Git环境中使用post hooks。 由于这是完全自动化的,因此在建立与远程服务器的SSH连接时无法输入登录凭据。 为解决此问题,我们将设置无密码SSH访问。 首先,您需要SSH到您的服务器。

ssh user@hostname

接下来,您需要确保在用户的主目录中有~/.ssh 如果没有,请继续创建一个。

mkdir ~/.ssh

在Mac和Linux上,您可以利用终端的强大功能一次性完成这两项任务。

if [ ! -d ~/.ssh ]; then mkdir ~/.ssh; fi

接下来,如果您还没有公钥,则需要生成公钥SSH密钥 列出~/.ssh目录中的文件进行检查。

ls -al ~/.ssh

您正在寻找的文件通常与id_rsa.pub类似。 如果您不确定,可以生成一个新的。 以下命令将使用提供的电子邮件作为标签创建SSH密钥。

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

您可能希望保留所有默认设置。 这将在之前创建的~/.ssh目录中创建一个名为id_rsa的文件。

出现提示时,请务必提供安全的SSH密码

如果必须创建SSH密钥,则需要配置ssh-agent程序以使用它。

ssh-add ~/.ssh/id_rsa

如果您知道自己在做什么,可以通过向ssh-agent提供私钥文件,在~/.ssh目录中使用现有的SSH密钥。

如果您仍然不确定发生了什么,您应该在~/.ssh目录中有两个与私钥和公钥文件对应的文件。 通常,公钥将是添加了.pub扩展名的同名文件。 一个示例是名为id_rsa的私钥文件和名为id_rsa.pub公钥文件。

在本地计算机上生成SSH密钥后,就可以将匹配的共享密钥文件放在服务器上了。

ssh user@hostname 'cat >> ~/.ssh/authorized_keys' < ~/.ssh/id_rsa.pub

这会将您的公钥添加到远程服务器上的授权密钥。 可以从每个开发机器重复该过程,以根据需要向服务器添加许多授权密钥。 当你关闭连接并重新连接而没有提示输入密码时,你就会知道你做得对了。


配置远程服务器存储库

您打算用作实时生产服务器的计算机需要具有可以写入适当的Web可访问目录的Git存储库。 Git元数据(.git目录)不需要位于Web可访问的位置。 相反,它可以是SSH用户可由用户编写的任何地方。

设置裸存储库

为了将文件推送到Web服务器,您需要在Web服务器上拥有存储库的副本。 您将首先创建一个裸存储库来容纳您的网站。 应该在Web根目录之外的某个位置设置存储库。 我们将指示Git稍后放置实际文件的位置。 确定存储库的位置后,以下命令将创建裸存储库。

mkdir mywebsite.git
cd mywebsite.git
git init --bare

裸存储库包含所有没有任何HEAD的Git元数据。 从本质上讲,这意味着您的存储库具有.git目录,但没有签出任何工作文件。 下一步是创建一个Git钩子,它会在你指示它时检查这些文件。

如果您希望从分离的工作树中运行git命令,则需要在运行任何命令之前将环境变量GIT_DIR设置为mywebsite.git的路径。

添加后接收挂钩

使用以下内容在存储库的hooks目录中创建名为post-receive的文件。

#!/bin/sh
GIT_WORK_TREE=/path/to/webroot/of/mywebsite git checkout -f

创建挂钩后,继续将其标记为可执行文件。

chmod +x hooks/post-receive

GIT_WORK_TREE允许您指示Git工作目录应该用于存储库的位置。 这允许您将存储库保留在Web根目录之外,并在Web可访问的位置使用分离的工作树。 确保您指定的路径存在,Git不会为您创建它。


配置本地开发机器

本地开发机器将容纳网站存储库。 只要您选择推送这些更改,相关文件就会被复制到实时服务器。 这意味着您应该在开发计算机上保留存储库的工作副本。 您还可以使用任何集中式存储库,包括基于云的存储库,如GitHub或BitBucket。 您的工作流程完全取决于您。 由于所有更改都是从本地存储库推送的,因此此过程不受您选择处理项目的方式的影响。

设置工作存储库

在您的开发机器上,您应该有一个可用的Git存储库。 如果没有,您可以使用以下命令在现有项目目录中创建。

git init
git add -A
git commit -m "Initial Commit"

添加指向Web服务器的远程存储库

拥有一个工作存储库后,您需要添加一个指向您在服务器上设置的遥控器的遥控器。

git remote add live ssh://server1.example.com/home/user/mywebsite.git

确保您提供的主机名和路径指向您先前设置的服务器和存储库。 最后,是时候将您当前的网站首次推送到实时服务器了。

git push live +master:refs/head/master

此命令指示Git将当前主分支推送到live远程分支。 (不需要发送任何其他分支。)将来,服务器只会从主分支中检出,因此您不需要每次都明确指定。


建立美好的东西

一切都准备好了。 现在是时候让创意果汁流动起来! 您的工作流程根本不需要更改。 无论何时准备好,将更改推送到实时Web服务器就像运行以下命令一样简单。

git push live

在服务器receive.denycurrentbranch设置为“ignore”会消除当您将更新推送到服务器上的签出分支时由最新版本的Git发出的警告。


其他提示

在使用这种工作流程时,您可能会发现一些有用的提示和技巧。

推动对多个服务器的更改

您可能会发现需要推送到多个服务器。 也许您有多个测试服务器,或者您的实时站点在负载均衡器后面的多个服务器上进行镜像。 在任何情况下,推送到多个服务器就像在.git/config[remote "live"]部分添加更多URL一样简单。

[remote "live"]
    url = ssh://server1.example.com/home/user/mywebsite.git
    url = ssh://server2.example.com/home/user/mywebsite.git

现在发出命令git push live将更新您一次添加的所有网址。 简单!

忽略对已跟踪文件的本地更改

您有时会发现存储库中存在要跟踪的文件,但不希望每次更新网站时都更改这些文件。 一个很好的例子是您网站中的配置文件,其中包含特定于该网站所在服务器的设置。 将更新推送到您的站点通常会使用开发计算机上存在的任何文件版本覆盖这些文件。 防止这种情况很容易。 SSH进入远程服务器并导航到Git存储库。 输入以下命令,列出要忽略的每个文件。

git update-index --no-assume-unchanged <file...>

这指示Git忽略对任何将来签出的指定文件的任何更改。 您可以在任何必要时随时撤消对一个或多个文件的此影响。

git ls-files -v | grep ^[a-z]

如果您想查看被忽略文件的列表,那也很容易。

 git ls-files -v | grep ^[az] 

参考

push代码只是更新远程存储库的引用。

它不会更改签出的工作副本。

考虑您可以将同事的存储库添加为远程存储库。 如果你推动并且行为是它将自动检出新代码,那将影响他们正在进行的工作。

这听起来像你真正想要的是一个持续集成工具,无论是全功能还是仅仅是从git钩子触发的rsync。

你应该只推送到一个bare存储库(除非你确切地知道你正在做什么;即便如此,你应该只推送到一个bare存储库)。

你不应该克隆工作副本的.git/目录。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM