如何从git repo中删除文件?

时间:2010-01-12 07:48:52

标签: git git-rm

我已将名为"file1.txt"的文件添加到git repo。之后我提交了它,添加了几个名为dir1dir2的目录,并将它们提交给git repo。

现在,当前仓库有"file1.txt"dir1dir2 如何在不影响"file1.txt"dir1等其他人的情况下删除dir2

24 个答案:

答案 0 :(得分:2716)

使用git rm

git rm file1.txt
git commit -m "remove file1.txt"

但是如果你只想从Git存储库中删除文件而不是从文件系统中删除它,请使用:

git rm --cached file1.txt
git commit -m "remove file1.txt"

并将更改推送到远程仓库

git push origin branch_name  

答案 1 :(得分:577)

git rm file.txt会从存储库中删除该文件,但也会从本地文件系统中删除该文件

要从repo中删除文件,从本地文件系统中删除它,请使用:
git rm --cached file.txt

以下确切情况是我使用git维护我公司网站的版本控制,但“mickey”目录是一个tmp文件夹,用于与CAD开发人员共享私人内容。当他需要巨大的文件时,我创建了一个私有的,未链接的目录和ftpd文件,供他通过浏览器获取。忘记我这样做了,后来我从网站的基本目录中执行了git add -A。随后,git status显示了需要提交的新文件。现在我需要从git的跟踪和版本控制中删除它们......

下面的示例输出来自我刚刚发生的事情,我无意中删除了.003文件。值得庆幸的是,我不关心本地副本发生在.003的情况,但其他一些当前更改的文件是我刚刚对网站所做的更新,并且会在本地文件系统上删除史诗! “本地文件系统”=实时网站(不是很好的做法,但却是现实)

[~/www]$ git rm shop/mickey/mtt_flange_SCN.7z.003
error: 'shop/mickey/mtt_flange_SCN.7z.003' has local modifications
(use --cached to keep the file, or -f to force removal)
[~/www]$ git rm -f shop/mickey/mtt_flange_SCN.7z.003
rm 'shop/mickey/mtt_flange_SCN.7z.003'
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
#   modified:   shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git rm --cached shop/mickey/mtt_flange_SCN.7z.002
rm 'shop/mickey/mtt_flange_SCN.7z.002'
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.002
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
[~/www]$

更新:这个答案正在获得一些流量,所以我想我会提到我的other Git answer分享一些很棒的资源:This page有一个帮助揭开神秘面纱的图像Git对我来说。 "Pro Git" book is online给了我很多帮助。

答案 2 :(得分:64)

如果您的文件已经在GitHub上,you now (July 2013) can会直接从网页GUI中删除它!

  

只需查看存储库中的任何文件,点击顶部的垃圾箱图标,然后像其他任何基于网络的编辑一样提交删除。

然后在您的本地仓库中“git pull”,这也将在本地删除该文件 这使得这个答案成为从git repo中删除文件的一种(环形)方法 (更不用说GitHub上的文件


delete button

(提交将反映删除该文件):

commit a deletion

  

就这样,它已经消失了。

     

有关这些功能的帮助,请务必阅读有关creatingmovingrenamingdeleting文件的帮助文章。

     

注意:由于它是一个版本控制系统,如果您以后需要恢复文件,Git总会退缩。

最后一句意味着删除的文件仍然是历史记录的一部分,您可以轻松地恢复它(但尚未通过GitHub Web界面):

请参阅“Restore a deleted file in a Git repo”。

答案 3 :(得分:50)

这是唯一对我有用的选择。

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch *.sql'

注意:将* .sql替换为您的文件名或文件类型。要非常小心,因为这将通过每次提交并翻录此文件类型。

编辑: 注意 - 在这个命令之后你将无法推或拉 - 你会看到拒绝'无关历史'你可以使用'git push --force -u origin master'来推或拉

答案 4 :(得分:33)

此外,如果它是要删除的文件夹及其后续子文件夹或文件,请使用:

git rm -r foldername

答案 5 :(得分:23)

更一般地说,git help至少可以帮助解决这样的简单问题:

zhasper@berens:/media/Kindle/documents$ git help
usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]

The most commonly used git commands are:
   add        Add file contents to the index
   :
   rm         Remove files from the working tree and from the index

答案 6 :(得分:15)

如果要从repo中删除文件,但将其保留在文件系统中(将不会被跟踪):

bykov@gitserver:~/temp> git rm --cached file1.txt
bykov@gitserver:~/temp> git commit -m "remove file1.txt from the repo"

如果要从repo和文件系统中删除文件,则有两个选项:

  1. 如果文件没有在索引中暂存更改:

    bykov@gitserver:~/temp> git rm file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    
  2. 如果文件在索引中暂存了更改:

    bykov@gitserver:~/temp> git rm -f file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    

答案 7 :(得分:12)

git rm将仅从现在开始删除此分支上的文件,但它仍保留在历史记录中,git会记住它。

正确的做法是使用git filter-branch,正如其他人在此提到的那样。它将重写分支历史记录中的每个提交以删除该文件。

但是,即使这样做,git也能记住它,因为在reflog,remotes,tags等中可以引用它。

如果您想一步完全删除它,我建议您使用git forget-blob

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

这很简单,只需git forget-blob file1.txt

这将删除每个引用,执行git filter-branch,最后运行git垃圾收集器git gc以完全删除回购中的此文件。

答案 8 :(得分:10)

另一种方法是,如果要使用rm命令从本地文件夹中删除该文件,然后将更改推送到远程服务器。

rm file1.txt

git commit -a -m "Deleting files"

git push origin master

答案 9 :(得分:7)

删除特定文件

  

git rm filename

以单张递归方式从目录中清除所有未跟踪的文件

  

git clean -fdx

答案 10 :(得分:5)

在我的情况下,我尝试在几次提交后删除github上的文件,但保存在计算机上

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch file_name_with_path' HEAD
git push --force -u origin master

以后忽略了这个文件

答案 11 :(得分:5)

如果你有GitHub for Windows应用程序,你可以通过5个简单步骤删除文件:

  • 点击同步。
  • 单击文件所在的目录,然后选择最新版本的文件。
  • 点击工具,然后选择“在这里打开一个shell。”
  • 在shell中,键入:“rm {filename}”并按Enter键。
  • 提交更改并重新同步。

答案 12 :(得分:4)

注意:如果您只想从git中删除文件,请在下面使用:

git rm --cached file1.txt

如果您也要从硬盘删除:

git rm file1.txt

如果要删除文件夹(该文件夹可能包含几个文件),则应使用递归命令删除,如下所示:

git rm -r foldername

如果要删除另一个文件夹中的文件夹

git rm -r parentFolder/childFolder

然后,您可以像往常一样commitpush。但是,如果要恢复已删除的文件夹,可以按照以下步骤操作:recover deleted files from git is possible.

  

来自文档:

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…​
     

选项

     

<file>…​

Files to remove. Fileglobs (e.g. *.c) can be given to remove all matching files. If you want Git to expand file glob characters, you
     

可能需要对它们进行脱壳。前导目录名称(例如dir到   可以指定删除dir / file1和dir / file2来删除其中的所有文件   目录以及所有子目录的递归,但这需要   -r选项要明确给出。    -f    --force

Override the up-to-date check.
     

-n    --dry-run

Don’t actually remove any file(s). Instead, just show if they exist in the index and would otherwise be removed by the command.
     

-r

Allow recursive removal when a leading directory name is given.
     

--

This option can be used to separate command-line options from the list of files, (useful when filenames might be mistaken for
     

命令行选项)。    --cached

Use this option to unstage and remove paths only from the index. Working tree files, whether modified or not, will be left alone.
     

-ignore-unmatch

Exit with a zero status even if no files matched.
     

-q    --quiet

git rm normally outputs one line (in the form of an rm command) for each file removed. This option suppresses that output.

Read more on official doc.

答案 13 :(得分:3)

  1. 首先,从本地存储库中删除文件。

      

    git rm -r文件名

    或者,仅从本地存储库中删除文件,但是从文件系统中删除文件

      

    git rm --cached File-Name

  2. 其次,Commit更改为本地存储库。

    <?php
    $get_post = "SELECT * FROM posts";
    $run_post = mysqli_query($connect, $get_post);
    if($run_post && mysqli_num_rows($run_post) > 0)
    {
        while($row_post = mysqli_fetch_array($run_post))
        {
            $post_title  = $row_post['post_title'];
            $get_user    = "SELECT * FROM users WHERE user_id='$user_id'";
            $run_user    = mysqli_query($connect, $get_user);
            $check_user  = mysqli_fetch_array($run_user);
            $user_name   = $check_user['name'];
            $user_images = $check_user['images'];
    
            echo "<div id='post_wrap'>
                <p>$post_title</p>
                <a href=''><button>Like</button></a>
                <a href=''><button>View</button></a>
                <a href=''><button>Delete</button></a>
                <a href=''><button>Edit</button></a>
                </div>";
        }
        mysqli_free_result($run_post);
    }
    else
    {
        echo "No post yet";
    }
    ?>
    
  3. 最后,将本地更改更新/推送到远程存储库。

    git commit -m "unwanted files or some inline comments"   
    

答案 14 :(得分:3)

根据documentation

git rm --cached file1.txt

涉及敏感数据时,最好不要说您删除了文件,而只是将其包含在最后一次已知的提交中:

0。修改最后一次提交

git commit --amend -CHEAD

如果要从所有git历史记录中删除文件,请按照documentation进行以下操作:

1。将其从您的本地历史记录中删除

git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \  --prune-empty --tag-name-filter cat -- --all
# Replace PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA with the path to the file you want to remove, not just its filename
  1. 别忘了将此文件包含在.gitignore 中(如果您不想共享该文件(例如密码...):
echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
git add .gitignore
git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"

3。如果您需要从遥控器中删除

git push origin --force --all

4。如果还需要将其从代码版本中删除:

git push origin --force --tags

答案 15 :(得分:2)

我尝试了很多建议的选项,但似乎都没有工作(我不会列出各种问题)。 我最终做的,有用的,简单直观(对我而言)是:

  1. 将整个本地回购移动到其他地方
  2. 从主服务器再次将repo克隆到本地驱动器
  3. 将文件/文件夹从#1中的原始副本复制回#2
  4. 的新克隆
  5. 确保问题大文件不存在或排除在.gitignore文件中
  6. 做通常的git add / git commit / git push

答案 16 :(得分:1)

Greg Hewgill编辑的Johannchopin的答案对我有帮助,因为我并不希望完全从历史记录中删除文件。 就我而言,它是一个目录,所以我所做的唯一更改是使用:

git rm -r --cached myDirectoryName

代替“ git rm --cached file1.txt” ..其次:

git commit -m "deleted myDirectoryName from git"
git push origin branch_name

感谢Greg HewgillJohannchopin

答案 17 :(得分:1)

转到您的项目目录并输入:

git filter-branch --tree-filter 'rm -f <deleted-file>' HEAD

在此之后--force从所有提交中删除文件。

git push origin --force --all

答案 18 :(得分:1)

对于git rm不足且需要从历史记录中删除文件的情况:正如git filter-branch手册页现在本身建议使用git-filter-repo一样,我必须这样做今天,这是使用该工具的示例。它使用示例存储库https://example/eguser/eg.git

  1. 将存储库克隆到新目录git clone https://example/eguser/eg.git

  2. 保留所有不需要的文件。 git-filter-repo --path file1.txt --invert-paths

  3. 重新添加远程存储库源: git remote add origin https://example/eguser/eg.gitgit-filter-repo工具会按设计删除远程远程信息,并建议a new remote repo(请参见第4点)。对于大型共享存储库来说,这是有意义的,但如本例所示,对于删除单个新添加的文件可能会过大。

  4. 对本地内容满意时,用它替换远程。

    git push --force -u origin master。由于更改了历史记录,因此需要强制。

还请注意,在加载和更改存储库历史记录之前,有用的--dry-run选项和链接的手册中有关团队和项目动态的讨论很好。

答案 19 :(得分:1)

使用git rm从存储库中删除文件后,可以使用BFG Repo-Cleaner从存储库历史记录中完全轻松地删除文件。

答案 20 :(得分:0)

如果您需要从确定的扩展名中删除文件(例如,编译文件),则可以执行以下操作一次删除所有文件:

git remove -f *.pyc

答案 21 :(得分:0)

只需进入github存储库中的文件,您就可以在Raw | Blame旁边看到删除图标,并且不要忘记单击commit changes按钮。您会看到您的文件已被删除。

答案 22 :(得分:0)

我有obj和bin文件,它们意外地进入了我不想污染我的“已更改文件”列表的仓库中

之后,我注意到他们去了遥控器,我将其添加到using (MySqlTransaction transaction = conn.BeginTransaction()) { using (MySqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = "INSERT INTO USERS(NAME_FIRST,NAME_LAST,DATE_OF_BIRTH) VALUES(@nameFirst,@nameLast,@dateOfBirth)"; cmd.Transaction = transaction; cmd.Parameters.AddWithValue("@nameFirst", user.NameFirst); cmd.Parameters.AddWithValue("@nameLast", user.NameLast); cmd.Parameters.AddWithValue("@dateOfBirth", user.DateOfBirth); cmd.Prepare(); cmd.ExecuteNonQuery(); lastInsertId = (uint)cmd.LastInsertedId; } }

.gitignore

问题是它们已经在远程中,并且当它们被更改时,它们会作为更改弹出并污染更改的文件列表。

要停止查看它们,您需要从远程存储库中删除整个文件夹。

在命令提示符下:

  1. 将CD放入repo文件夹(即/*/obj /*/bin
  2. 我要删除SSIS \ obj。看来您只能在顶层删除,因此现在需要将CD放入SSIS :(即C:\repos\MyRepo
  3. 现在输入魔咒C:\repos\MyRepo\SSIS
    • rm =删除
    • -r =递归删除
    • -f =表示力量,因为您是真的意思
    • obj是文件夹
  4. 现在运行git rm -r -f obj

我收到一条警告消息,说 13个文件更改了315222个删除项

然后,因为我不想查找CMD行,所以我进入了Visual Sstudio并进行了同步,以将其应用于远程

答案 23 :(得分:-7)

如果您没有在本地仓库中存档但是在git repo中,那么只需通过网络界面在git repo中打开文件,然后在界面的右上角找到删除按钮。 Click Here, To view interface Delete Option