this post was submitted on 13 Jun 2024
52 points (85.1% liked)

Linux

48332 readers
928 users here now

From Wikipedia, the free encyclopedia

Linux is a family of open source Unix-like operating systems based on the Linux kernel, an operating system kernel first released on September 17, 1991 by Linus Torvalds. Linux is typically packaged in a Linux distribution (or distro for short).

Distributions include the Linux kernel and supporting system software and libraries, many of which are provided by the GNU Project. Many Linux distributions use the word "Linux" in their name, but the Free Software Foundation uses the name GNU/Linux to emphasize the importance of GNU software, causing some controversy.

Rules

Related Communities

Community icon by Alpár-Etele Méder, licensed under CC BY 3.0

founded 5 years ago
MODERATORS
 

Git repos have lots of write protected files in the .git directory, sometimes hundreds, and the default rm my_project_managed_by_git will prompt before deleting each write protected file. So, to actually delete my project I have to do rm -rf my_project_managed_by_git.

Using rm -rf scares me. Is there a reasonable way to delete git repos without it?

all 47 comments
sorted by: hot top controversial new old
[–] [email protected] 91 points 5 months ago

Using rm -rf scares me. Is there a reasonable way to delete git repos without it?

I don't know what to tell you, that's the command you need to use.

If you're that worried you're going to nuke important stuff, make backups, and don't use sudo for user files.

[–] [email protected] 53 points 5 months ago (1 children)

So.... you're afraid of the command that does the thing you're trying to do?

[–] Buttons 11 points 5 months ago* (last edited 5 months ago) (3 children)

More like, I'm afraid of the command doing more than I'm trying to do.

What I want to do is ignore prompts about write-protected files in the .git directory, what it does is ignore all prompts for all files.

[–] [email protected] 30 points 5 months ago

You just need to do this then

cd git-project
rm -rf .git
cd ..
rm -r git-project

With rm -r is for (R)ecursion and -f is for F(force) disabled the prompting. So, use -f on the .git directory which has the files you want to obliterate, and leave it off for the safety prompts.

[–] [email protected] 12 points 5 months ago (1 children)

so why not rm -rf folder/.git/* then rm -r folder/*

[–] [email protected] 8 points 5 months ago (2 children)

Maybe they're afraid of accidentally writing rm -rf folder/.git /* or something

[–] Buttons 5 points 5 months ago (4 children)

That's a good example. If I'm regularly running a command that is a single whitespace character away from disaster, that's a problem.

Imagine a fighter aircraft that had an eject button on the side of the flight stick. The pilot complains "I'm afraid I might accidentally hit the eject button when I don't need to", but everyone responds "why would you push the eject button if you don't want to eject?", or "so your concern is that the eject button will cause you to eject...?" -- That's how I feel right now.

[–] [email protected] 4 points 5 months ago

I understand the mindset you have, but trust me, you'll learn (sooner or later) a habit to pause and check your command before hitting enter. For some it takes a bit longer and it'll bite you in the butt for few times (so have backups), but everyone has gone down that path and everyone has fixed their mistakes now and then. If you want hard (and fast) way to learn to confirm your commands, use dd a lot ;)

One way to make it a bit less scary is to 'mv /tmp' and when you confirmed that nothing extra got removed you can 'cd /tmp; rm -rf ', but that still includes the 'rm -rf' part.

[–] [email protected] 2 points 5 months ago* (last edited 5 months ago)

How about writing a script to automate the deletion, thus minimizing the chance of human error being a factor? It could include checks like "Is this a folder with .git contents? Am I being invoked from /home/username/my_dev_workspace?"

In a real aviation design scenario, they want to minimize the bullshit tasks that take up cognitive load on a pilot so they can focus on actually flying. Your ejector seat example would probably be replaced with an automatic ejection system that's managed by the flight computer.

[–] [email protected] 1 points 5 months ago

Are you regularly deleting git repos?

[–] [email protected] 1 points 5 months ago (1 children)

Generally that is not a concern because regular users won't be able to rm anything else other than those in his own $HOME.

Another thing I want to say is, command line is for careful users. If someone is careless, they should create a wrapper around rm, or just use a FM.

[–] [email protected] 1 points 5 months ago

If someone is careless, they should create a wrapper around rm, or just use a FM.

I think that's the situation OP is in.. They don't trust themself with these kinds of commands, while other commenters here are trying to convince them that they should just use rm -rf anyway

[–] gamma 1 points 5 months ago

What about adding the flags last?

rm deletethisrepo -rf
[–] [email protected] 35 points 5 months ago* (last edited 5 months ago)

I’ve shot myself in the foot enough times over the years with rm -rf. Now I use trash-cli. I don’t know what package manager(s) you use, but I install it via Homebrew.

[–] [email protected] 19 points 5 months ago* (last edited 5 months ago) (1 children)

chmod -R the directory first?

[–] [email protected] 6 points 5 months ago* (last edited 5 months ago)

This, lol just remove write protection if -f is too spooky

[–] [email protected] 16 points 5 months ago (2 children)

Maybe use a graphical file manager?

Or move the folder to /tmp or so.

[–] [email protected] 3 points 5 months ago

Or a tui file manager like ncdu

[–] [email protected] 12 points 5 months ago* (last edited 5 months ago) (1 children)

A tip I saw some time ago is to do:

rm folder -rf

Additionally you could move the git folder to the trash folder. I think it's usually located at $HOME/.local/share/trash/files/

Then you can delete it from the trash once you're certain you got the right folder

[–] [email protected] 16 points 5 months ago* (last edited 5 months ago) (1 children)

Additionally you could move the git folder to the trash folder. I think it's usually located at $HOME/.local/share/trash/files/

Moving something to the trash files folder isn't the correct way to trash it, since the Trash specification requires storing some metadata for each trash item.

You should use eg. trash-cli instead.

[–] [email protected] 7 points 5 months ago
[–] [email protected] 12 points 5 months ago

The problem is that rm -rf shouldn't scare you?

What are the chances something like

~/projects/some-project $ cd ..
~/projects $ rm -fr some-project

may delete unexpected stuff? (especially if you get into the habit of tab-completing the directory argument)

[–] [email protected] 9 points 5 months ago

Use rm -rf. If you are scared of mistakes, type echo rm -rf nameofdirectory, check it, go back, delete the echo and press enter.

[–] [email protected] 9 points 5 months ago* (last edited 5 months ago)

If you’re that worried, why not run chmod -R u+w .git inside the project dir to “un write-protect” the files, then just ascend to the directory containing the project dir (cd ..) and use rm -r without -f?

The force flag (-f) is the scary one, I presume?

[–] [email protected] 8 points 5 months ago

chmod -R 777 my_project_managed_by_git && rm -r my_project_managed_by_git

[–] [email protected] 6 points 5 months ago* (last edited 5 months ago)

If you’re nervous about rm, there’s many alternatives that work by moving a file to your recycling bin instead of deleting it outright. I think the current fun one is trash-rs, but some distros package trash-cli.

[–] [email protected] 6 points 5 months ago* (last edited 5 months ago)

Cd into the directory first, then run rm -rf, then cd back out and rm -r just the directory.

E:fb

[–] [email protected] 5 points 5 months ago

You should have backups. Preferably also snapshots. Then rm will feel less scary.

[–] [email protected] 3 points 5 months ago

its a bit verbose but my preference is rm -r --interactive=never directoryname

i really try to avoid rf for myself

[–] [email protected] 3 points 5 months ago

https://github.com/nivekuil/rip This is what you're looking for

[–] [email protected] 2 points 5 months ago* (last edited 5 months ago)

If you're scared to do rm -rf, do something else that lets you inspect the entire batch of deletions first. Such as:

find .git ! -type d -print0 | xargs -0 -n1 echo rm -fv

This will print out all the rm -fv commands that would be run. It's basically rm -rf --dry-run, but rm doesn't have that common option. Once you've verified that that's what you want to do, run it again without echo to do the actual deletion. If you're scared of having that in your history, either use a full path for .git, or prepend a space to the non-echo version of the command to make it avoid showing up in your shell history (assuming you have ignorespace in your HISTCONTROL env var)

I use this xargs echo pattern a lot when I'm crafting commands that are potentially destructive or change lots of things.

[–] [email protected] 2 points 5 months ago* (last edited 5 months ago)

You can use ls <PATH> first to check you are deleting the right files. I do this and I've never accidentally deleted the wrong files (using rm).

[–] [email protected] 2 points 5 months ago

use relative paths (cd into the directory below your repository) and use tab completion, and you won't have problems.

[–] [email protected] 1 points 5 months ago* (last edited 5 months ago)

honestly I don't think there is a better way, like others have said you can use a trash program or you can chmod the git directory before deleting but, I would recommend against the comments saying alias the command, that can lead to even bigger problems if you typo thr alias or mess up in the script. rf can't break anything unless you say the wrong directory which would be the same with aliases anyway,

My recommendation out of them all would be using a trash program to move it to the trash that way if you do screw up the location you have a way to restore it otherwise you could make a script to list the files affected using ls and then prompt a yes/no prompt using read before doing the rm script, but that's something you definitely want to test in a sandbox or user restricted environment if you're not used to scripting in case something breaks

[–] [email protected] 1 points 5 months ago

OSX - mv my_project ~/.Trash

[–] [email protected] -1 points 5 months ago (1 children)
[–] [email protected] 1 points 5 months ago

That or an oil change