我有一个大问题,我无法理解这个话题。我有一个带网站的服务器。我用.box
在那里创建了一个存储库。比起我git init
将所有文件从我的服务器添加到存储库。比我做git add *
将所有文件提交到存储库。
我将commit
克隆到我当地的客户端。
一切正常,我从我的项目中得到了一份副本。不,我在本地版本上更改了某些内容,并使用git clone ssh://username@mysite.com/wordpress/.git
创建了commit
。我查看了FileZilla,但文件中的内容没有改变。另一方面,当我在服务器上更改了某些内容并将push
更改为本地副本时,我看到了更改。您知道为什么我在本地副本上所做的更改在我的服务器上不可见吗?
感谢您的帮助!
答案 0 :(得分:5)
您需要将更改推送到本地计算机和服务器都可以从中取出的中央存储库(或者将它们作为远程接口添加)。像GitHub这样的服务很适合这个。以下是适用于此的完整工作流程的说明。可在此gist中找到更新的说明。此工作流使用挂钩来完成繁重的工作,以便自动更新服务器。
作为一名自由职业者,我建立了很多网站。需要跟踪的代码有很多变化。值得庆幸的是,具有适当分支的Git启用的工作流程可以缩短项目跟踪工作。我可以很容易地看到分支机构的开发功能以及网站的快照。生产代码。对该工作流程的一个很好的补充是能够使用Git将更新推送到我提交变更时所处理的各个站点。
您需要在开发计算机上以及要托管网站的服务器或服务器上安装Git。此过程甚至可以适用于多个服务器,例如负载均衡器后面的镜像。
更新实时Web服务器的过程依赖于在Git环境中使用post hooks。由于这是完全自动化的,因此在建立与远程服务器的SSH连接时无法输入登录凭据。为解决此问题,我们将设置无密码SSH访问。首先,您需要通过SSH连接到您的服务器。
ssh user@hostname
接下来,您需要确保在用户的主目录中有~/.ssh
。如果没有,请继续创建一个。
mkdir ~/.ssh
在Mac和Linux上,您可以利用终端的强大功能一次性完成这两项工作。
if [ ! -d ~/.ssh ]; then mkdir ~/.ssh; fi
接下来,如果您还没有generate a public SSH key,则需要a secure SSH passphrase。列出~/.ssh
目录中要检查的文件。
ls -al ~/.ssh
您要查找的文件通常与id_rsa.pub
类似。如果您不确定,可以生成一个新的。以下命令将使用提供的电子邮件作为标签创建SSH密钥。
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
您可能希望保留所有默认设置。这将在先前创建的id_rsa
目录中创建名为~/.ssh
的文件。
出现提示时,请务必提供Deploy Your Website Changes Using Git。
如果必须创建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"
拥有工作存储库后,您需要添加一个指向您在服务器上设置的遥控器。
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
设置为&#34;忽略&#34;当您将更新推送到服务器上的签出分支时,服务器上的警告消除了由最新版本的Git发出的警告。
在采用这种工作流程时,您可能会发现一些有用的提示和技巧。
您可能会发现需要推送到多台服务器。也许您有多个测试服务器,或者您的实时站点在负载均衡器后面的多个服务器上进行镜像。无论如何,推送到多个服务器就像向[remote "live"]
中的.git/config
部分添加更多网址一样简单。
[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忽略对任何将来签出的指定文件的任何更改。您可以在任何必要时随时撤消对一个或多个文件的影响。
git update-index --no-assume-unchanged <file...>
如果您想查看被忽略文件的列表,那也很容易。
git ls-files -v | grep ^[a-z]
答案 1 :(得分:1)
push
代码只是更新远程存储库的引用。
它不会更改签出的工作副本。
考虑您可以将同事的存储库添加为远程存储库。如果您推送并且行为是自动检出新代码,那将影响他们正在处理的内容。
听起来你真正想要的是一个持续集成工具,无论是全功能还是仅仅是从git hook触发的rsync。
答案 2 :(得分:1)
你应该只推送到bare
存储库(除非你确切知道自己在做什么;即使这样,你也应该只推送到bare
存储库)。
你不应该克隆工作副本的.git/
目录。