将本地非git工作合并到远程git仓库

4
我想将一个未初始化git的文件夹与远程git仓库合并。
以下方法可行:
git init
git add
git commit

git remote add origin [url]
git fetch
git rebase origin/master
git push -u origin master

另一种选择是:

git init
git add
git commit

git remote add origin [url]
git pull --allow-unrelated-histories origin master
git push -u origin master

--allow-unrelated-histories太长了(Git的创建者不希望实现快捷方式,因为“这是罕见的情况”),而且我听说在这种情况下最好使用rebase而不是merge。您知道有更快的方法吗?
编辑: 我的工作流程:网站代码在ftp上,我直接在ftp上工作,因为这样对我来说更方便。我将ftp文件夹拖到桌面上,并运行git命令以合并本地ftp更改和协作者GitHub的更改。为什么我直接在ftp上工作: - 它所有的都集成在我的IDE中,我可以用一个软件随时修改 - 没有本地服务器可以用 - 除非协作者在GitHub上进行了更改,否则无需从本地传输到ftp - 网站的可付费插件不在本地,因此我无法拥有适当的本地测试环境 - 我曾经在本地工作,但由于任何原因将代码传输到ftp时结果均不同
我同意这可能是“手工制作”的,但既然有另一个人加入,我们将代码放在GitHub上,并使用上述git命令解决了我们代码之间的同步问题。我对代码具有写访问权限,因此无需fork / pull request。我不需要永久保留本地存储库,因此我更喜欢清除它,但是如果SCM需要我保留所有项目的本地存储库,则我将执行,但是...我不喜欢它,因为我不需要它,这就是我在第一条信息中找到解决方案的原因。
您认为我应该有更好的工作流程吗?您认为我们应该为小修改而使用不同的分支(如果允许具有更干净的历史记录,我会这样做,因为我喜欢保持有组织和精益工作,顺便说一下,这就是我使用rebase而不是merge的原因)?
实际上,重要的问题是:大型团队如何将其GitHub代码与ftp代码同步(并检查新的GitHub代码在更新存储库和实际ftp存储库之前是否正常)?愚蠢的问题:他们从FTP开始进行SCM(如何?这将很棒)?
我刚刚开始接触SCM,我正在考虑所有这些问题...

如果这种情况经常发生,为什么不写一个别名呢? - Zeta
"--allow-unrelated-histories is long to write",因此请使用Tab键自动补全 - Chris
2个回答

1

你知道更快的方法吗?

这是错误的问题。正确的问题是:除了本地或远程仓库之外,是什么驱使你去做任何与SCM无关的工作?

关于如何以最快的方式将你的工作与远程仓库同步的问题是合理的,但由于你没有提供有关你的工作流程的任何细节,我们不能确定地回答这个问题。

我建议采用以下工作流程:

  1. 如果在Github上-如果适当的话,首先fork远程repo
  2. 在本地PC上,在进行任何工作之前克隆远程repo(或您的fork),以便您可以在本地repo中工作。
  3. 为此功能/输出创建一个将来要合并的分支
  4. 在分支中完成所有工作,利用Git的SCM提交和其他操作以创建历史记录,并随时撤销更改
  5. 定期将您的分支推送到远程,以便其他人可以看到正在进行的工作(例如,如果您需要帮助)并为您提供备份。
  6. 准备好合并后,只需发出pull-request(如果适用)(或在您自己的fork中),以便进行代码/工件审查; 或者,如果该项目是这样运作的,只需合并到主分支中。

可能有一些备选策略我们可以推荐更多细节,但我认为你让事情变得比必须的要复杂,尤其是在合并与rebase问题上,这必须意味着在您的远程repo中,唯一的分支是master(!) - 您是否熟悉Gitflow模型来维护多个开发,实验分支?您是否熟悉Git中分支和合并的简易性?

Git是为分布式源代码控制管理而设计的 - 因此在开发过程中请使用它!


针对问题中添加的更长历史记录进行更新

如果我正确理解您的情况,我认为上述方法仍然可以正常工作。建议在本地计算机上创建Github存储库的镜像,并保留在那里。尽管您说这样更方便,但您仍然可以通过FTP在服务器上进行所有更改 - 但是我建议小心使用,因为这样(如果我理解正确)会更改实时网站。如果这对您的情况有效(包括在未先测试新版本的情况下进行更改的危险),那么就可以了。

考虑到您的特定情况,我建议尝试以下两种方法 - 但我不确定Git将如何与FTP交互(即希望它不会刷新现有文件的日期或任何其他导致Git将其视为已更改的内容)。

  1. 继续做你正在做的事情 - 除了在本地PC上留下一个loco仓库。这种方法只会将您的更改作为新提交转储到主分支。

    • 对FTP站点进行新更改
    • 准备将更新添加到仓库时,从远程服务器获取到本地服务器以捕获远程上的任何新提交,然后再从FTP下载。
    • 将更改从FTP拉到本地仓库中,仅覆盖任何现有文件。如果这样工作,那么git状态将仅显示此时更改的文件。
    • 执行git add .以将所有更改添加到索引中
    • 使用您的更改提交到主分支
    • 推送到远程,这应该只会将您的新提交与您的新更改添加到远程。如果在您的获取和推送之间有其他人提交,则可能存在冲突的小可能性。
    • 反复执行
  2. 采用分支策略。仍保留本地仓库

    • 制定一些分支策略,让仓库中的每个人都同意(听起来只有两个人)。在这种情况下,我建议您只从主分支分出一个单独的分支,可能只是以您的名字或“dev”,“web”等命名(简短且易于输入!)。
    • 或者,您可以为每个更改分支,但这听起来在这里有些过度了。
    • 您对站点进行的任何更改都可以从FTP下载并添加/提交到您的本地分支。
    • 任何时候您有一个要合并到主分支的提交,请执行获取、合并,然后拉取。
    • 优势1:您可以随时将更改提交到本地仓库,这将存储所有更改的历史记录,并允许您在FTP站点出现问题时随时还原到以前的提交。
    • 优势2:您的单独分支将在远程仓库上复制,以便所有参与者都可以查看该分支的历史记录、合并时间等,如果需要跟踪问题的历史记录。
    • 优势3:如果多个人尝试合并,则仍然可以使用拉取请求从分支合并,这应该避免任何冲突(即让维护远程的人决定何时合并它,或者如果存在问题则开放沟通)。换句话说,您不需要负责主分支,您可以只呆在自己的分支中。
如果这些方案对你来说都不可行 - 我建议你尝试我发布的另一种解决方案。每次都无需删除本地仓库,所以甚至可以省去一个步骤,我想 - 或者只是将其作为获取而不是克隆?

谢谢你的回答!“除了版本控制之外,是什么驱使你去做其他工作?” 简短的回答是:因为我在处理ftp。我编辑了我的问题以添加我的工作流程细节。也许您可以考虑这一点再回答一下 :) - Victor Massé
@VictorAlexandre 我根据您的编辑/更新更新了答案,加入了第二部分。我认为您可以继续做您正在做的事情,但是如果您切换到使用本地存储库,则将具有分支测试更改、提交部分完成的内容而不推送到远程以及SCM通常为您提供的所有其他功能的优势。 - LightCC

0

我真的认为我的另一个答案更好,但这里有一个替代方案可以完全满足您的要求...

在您的开发文件夹的父级目录中,该目录不在版本库中:

> git clone [repo URL]
> cd [repo name]
> mv ../[folder name of your stuff] .
> git add .
> git commit -m "added my stuff in folder [folder name of your stuff]"

实际上,你首先是克隆 repo,然后只需将开发文件夹移动到 repo 中,添加它并提交到你需要的分支(我假设这里是主分支)。

这可能会更简短,更清晰 - 更容易理解,因为你是在 repo 已经存在之后添加项目,所以你不必拥有具有不同历史记录的单独主分支。

编辑: 鉴于更新的历史记录,你甚至可以通过直接从网站服务器 FTP 下载到本地 repo 中来进一步缩短此过程(而不是强制执行 mv 命令)。

你也可以始终保留本地 repo,并将克隆变成获取。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接