6

我有一个开发人员在一个文件夹上工作,另一个在另一个文件夹上工作。我想用一个特定的文件夹更新产品,我正在寻找一个类似的命令:

cd /myproject
git pull myfolder

并期望只有 myfolder 会被更新

可能吗?

好的,我会改写...我有一个项目,一个分支,两个开发人员和项目中有两个文件夹。每个开发人员都在一个文件夹上工作。两者都进行更改并将它们推送到分支中。

我只想将一个文件夹的更改拉到我的本地机器中

基本/简单不是吗?

4

3 回答 3

5

假设您真正要的是从 git 存储库远程获取文件,而没有您自己的工作树(或本地存储库的克隆),您可以这样做:

git archive --format=tgz --remote=<url-to-repo> master -- myfolder | tar zxvf -

这表示要创建存储库主分支的 gzip 压缩 tar 球<url-to-repo>,但仅包含myfolder. 通过管道tar将取消归档数据并将其放在当前工作目录中。

如果您实际上是在尝试管理工作树并与其他两个开发人员一起工作,那么您要求做的事情确实违背了工具的本质。但是您必须更加详细地说明您要完成的工作,以便有人提出好的工作流程建议。

更新

因此,听起来好像您只想在托管工作树中获取一个文件夹的更改。抱歉,Git 不是这样操作的。正如我在下面的评论中所说,Git 管理文件树。它不允许树的一部分处于一个修订版,而另一部分像您建议的那样处于不同的修订版 - 也许您是 Subversion 的先前用户,这可能吗?

您可以获得类似于您想要的效果,但您必须修改您的工作副本。我不会提交修改,除非您想放弃您的开发人员之一。你可以这样做:

$ git fetch
$ git checkout @{u} -- myfolder

git fetch将使您的远程参考保持最新——它将从服务器获取最新信息。 git checkout @{u} -- myfolder将使 myfolder看起来像跟踪分支中存在的内容。这有两个后果:

  • 您没有本地分支上的所有更改(并且您不想要它们,所以没关系),并且

  • myfolder将显示为正在修改,因为 的内容myfolder已使用远程存储库中可用的最新版本进行了更新,但它与您当前的修订版本不同。

要使您的工作副本恢复正常,请执行以下操作:

$ git checkout -- myfolder

从那里,您调用按照通常的机制让您的分支与远程(可能git pull)保持同步。

但是,这可能不是您想要的操作方式。尽管您的评论是 “用例无关紧要”,但这确实很重要。通常有更好的方法来实现您的总体目标和管理您的开发,但这需要了解您正在尝试做什么。目前,您的建议确实与 Git 的预期工作方式背道而驰。

因此,让我为您提供一些东西。使用主题分支 作为管理正在完成的开发工作的一种方式进行研究,而不是为树中的每个开发人员使用文件夹。可以在分支上进行清晰、合乎逻辑的更改,并在您测试和批准将它们包含到生产中时合并它们。

一个很好的起点就 在这里。它本身包含相当多的信息,其中一些包含指向几种不同风格的 Git 工作流的链接。您想要结束的地方是提交代表您实际投入生产的版本的地方,而不会破坏其他人为您所做的工作。理想情况下,您会以某种有意义的方式标记已投入生产的内容。

我知道没有人喜欢听,但培训可能对您的情况很有帮助。GitHub 提供了一些免费的在线课程 以及其他一些资源。从经验来看,一旦你掌握了 Git 的工作原理以及它解决的问题,你最终会得到一个更好的工作流程。

于 2013-08-23T00:06:31.260 回答
1

你有某种生产分支吗?假设一个开发和生产分支......

# Get all the changes from the dev branch
git checkout dev
git pull origin dev

# Checkout the production branch
git checkout production

# Checkout the dev version of the folder you want
git checkout dev myfolder

# Commit all the changes that are now showing up.

这是一种糟糕的做事方式,因为当您签出并重新提交该文件夹时,您会丢失更改历史记录。

于 2013-08-19T21:46:21.043 回答
0

是的,很容易git fetch只有一个 git 子目录。假设您的远程 git-repo 中有以下项目目录。

project/  
  ├── code  
  └── data  

目前假设您已将项目克隆到本地文件系统作为 git 存储库。

$ cd project
$ rm -rf code 

#now we try to fetch the "code" directory.
$ git fetch 
$ git checkout HEAD code

如果您有嵌套的目录结构,例如,

project/
├── code
│   ├── dev
│   └── test
└── data

然后在这种情况下,您应该使用您想要的特定目录,

$ git checkout HEAD code/dev
于 2016-01-07T22:21:21.783 回答