在服务器端创建一个git仓库

v9tzhpje  于 2023-02-07  发布在  Git
关注(0)|答案(3)|浏览(144)

我有一个大问题,我不能理解这个主题。我有一个网站服务器。我用git init创建了一个仓库。然后我做了一个git add *把所有文件从我的服务器添加到仓库。然后我做了一个commit把所有文件提交到仓库。
然后我用git clone ssh://username@mysite.com/wordpress/.git将它克隆到我的本地客户机。
所有工作正常,我从我的项目得到了一个副本。不,我改变了我的本地版本的东西,并作出了commitpush。我在FileZilla中查找,但文件中的内容没有改变。在另一个方向,当我改变了服务器上的东西和pulled它到本地副本,我看到了变化。您知道为什么我在本地副本上所做的更改在服务器上不可见吗?
谢谢你的帮助!

brccelvz

brccelvz1#

你需要将修改推送到一个中央仓库,本地机器和服务器都可以从这个仓库中提取修改(或者将修改添加为彼此的远程版本)。GitHub这样的服务很适合这样做。下面是一个完整的工作流程的说明,这个工作流程很适合这样做。更新的说明可以在gist中找到。这个工作流程使用钩子来完成繁重的工作,这样服务器的更新就可以自动化。

使用Git管理实时网站

概述

作为一个自由职业者,我建立了很多网站。这需要跟踪大量的代码更改。谢天谢地,一个支持Git的工作流加上适当的分支使得项目跟踪的工作量很小。我可以很容易地看到分支中的开发特性以及站点生产代码的快照。该工作流的一个很好的补充是在提交更改时使用Git将更新推送到我工作的任何不同站点的能力。
你需要在你的开发机器上安装Git,同时也需要在你希望托管网站的服务器上安装Git,这个过程甚至可以调整为与多个服务器一起工作,比如负载平衡器后面的镜像。

设置无密码SSH访问

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

ssh user@hostname

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

mkdir ~/.ssh

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

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

接下来,如果你还没有generate a public SSH key的话,你需要检查一下~/.ssh目录下的文件。

ls -al ~/.ssh

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

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

你可能希望保留所有的默认设置,这将在之前创建的~/.ssh目录中创建一个名为id_rsa的文件。
出现提示时,请确保提供a secure SSH passphrase
如果必须创建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

空仓库包含所有Git元数据,但没有HEAD。本质上,这意味着你的仓库有一个.git目录,但没有 checkout 任何工作文件。下一步是创建一个Git钩子,在你指示它 checkout 这些文件时,它会随时 checkout 这些文件。
如果你想从分离的工作树运行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/main

此命令指示Git将当前主分支推送到live远程节点(无需发送任何其他分支)。将来,服务器将只从主分支 checkout ,因此您无需每次都显式指定。

打造美好

一切准备就绪。是时候让创意的汁液流动了!您的工作流程根本不需要更改。只要您准备就绪,将更改推送到实时Web服务器就像运行以下命令一样简单。

git push live

在服务器上将receive.denycurrentbranch设置为“ignore”可以消除当您将更新推送到服务器上的 checkout 分支时,最新版本的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 --assume-unchanged <file...>

这指示Git在以后 checkout 指定文件时忽略对指定文件的任何更改。您可以在任何时候在一个或多个文件上撤销此效果。

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

如果你想看到一个被忽略文件的列表,这也很容易。

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

参考文献

zujrkrfu

zujrkrfu2#

push处理代码仅仅更新远程存储库的引用。
它不会更改检出的工作副本。
考虑一下你可以把一个同事的仓库作为远程仓库来添加,如果你按下,它的行为是自动 checkout 新代码,这将影响他们正在做的事情。
听起来您真正想要的是一个持续集成工具,无论它是功能齐全的工具,还是仅仅是一个从git hook触发的rsync。

fkaflof6

fkaflof63#

你应该只推送到bare存储库(除非你确切地知道你在做什么;即使这样,您也应该只推送到bare存储库)。
你不应该克隆工作拷贝的.git/目录。

相关问题