我有一个开发人员在一个文件夹上工作,另一个在另一个文件夹上工作。我想用一个特定的文件夹更新产品,我正在寻找一个类似的命令:
cd /myproject
git pull myfolder
并期望只有 myfolder 会被更新
可能吗?
好的,我会改写...我有一个项目,一个分支,两个开发人员和项目中有两个文件夹。每个开发人员都在一个文件夹上工作。两者都进行更改并将它们推送到分支中。
我只想将一个文件夹的更改拉到我的本地机器中
基本/简单不是吗?
假设您真正要的是从 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 的工作原理以及它解决的问题,你最终会得到一个更好的工作流程。
你有某种生产分支吗?假设一个开发和生产分支......
# 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.
这是一种糟糕的做事方式,因为当您签出并重新提交该文件夹时,您会丢失更改历史记录。
是的,很容易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